@@ -958,7 +958,8 @@ TWriteSessionImpl::TProcessSrvMessageResult TWriteSessionImpl::ProcessServerMess
958
958
FirstTokenSent = true ;
959
959
}
960
960
// Kickstart send after session reestablishment
961
- SendImpl ();
961
+ FormGrpcMessagesImpl ();
962
+ SendGrpcMessages ();
962
963
break ;
963
964
}
964
965
case TServerMessage::kWriteResponse : {
@@ -1140,13 +1141,15 @@ void TWriteSessionImpl::CompressImpl(TBlock&& block_) {
1140
1141
1141
1142
void TWriteSessionImpl::OnCompressed (TBlock&& block, bool isSyncCompression) {
1142
1143
TMemoryUsageChange memoryUsage;
1143
- if (!isSyncCompression) {
1144
+ if (isSyncCompression) {
1145
+ // The Lock is already held somewhere up the stack.
1146
+ memoryUsage = OnCompressedImpl (std::move (block));
1147
+ } else {
1144
1148
with_lock (Lock) {
1145
1149
memoryUsage = OnCompressedImpl (std::move (block));
1146
1150
}
1147
- } else {
1148
- memoryUsage = OnCompressedImpl (std::move (block));
1149
1151
}
1152
+ SendGrpcMessages ();
1150
1153
if (memoryUsage.NowOk && !memoryUsage.WasOk ) {
1151
1154
EventsQueue->PushEvent (TWriteSessionEvent::TReadyToAcceptEvent{IssueContinuationToken ()});
1152
1155
}
@@ -1162,7 +1165,7 @@ TMemoryUsageChange TWriteSessionImpl::OnCompressedImpl(TBlock&& block) {
1162
1165
(*Counters->BytesInflightCompressed ) += block.Data .size ();
1163
1166
1164
1167
PackedMessagesToSend.emplace (std::move (block));
1165
- SendImpl ();
1168
+ FormGrpcMessagesImpl ();
1166
1169
return memoryUsage;
1167
1170
}
1168
1171
@@ -1279,7 +1282,7 @@ size_t TWriteSessionImpl::WriteBatchImpl() {
1279
1282
}
1280
1283
CurrentBatch.Reset ();
1281
1284
if (skipCompression) {
1282
- SendImpl ();
1285
+ FormGrpcMessagesImpl ();
1283
1286
}
1284
1287
return size;
1285
1288
}
@@ -1343,7 +1346,16 @@ bool TWriteSessionImpl::TxIsChanged(const Ydb::Topic::StreamWriteMessage_WriteRe
1343
1346
return GetTransactionId (*writeRequest) != GetTransactionId (OriginalMessagesToSend.front ().Tx );
1344
1347
}
1345
1348
1346
- void TWriteSessionImpl::SendImpl () {
1349
+ void TWriteSessionImpl::SendGrpcMessages () {
1350
+ with_lock (ProcessorLock) {
1351
+ TClientMessage message;
1352
+ while (GrpcMessagesToSend.Dequeue (&message)) {
1353
+ Processor->Write (std::move (message));
1354
+ }
1355
+ }
1356
+ }
1357
+
1358
+ void TWriteSessionImpl::FormGrpcMessagesImpl () {
1347
1359
Y_ABORT_UNLESS (Lock.IsLocked ());
1348
1360
1349
1361
// External cycle splits ready blocks into multiple gRPC messages. Current gRPC message size hard limit is 64MiB.
@@ -1413,7 +1425,7 @@ void TWriteSessionImpl::SendImpl() {
1413
1425
<< OriginalMessagesToSend.size () << " left), first sequence number is "
1414
1426
<< writeRequest->messages (0 ).seq_no ()
1415
1427
);
1416
- Processor-> Write (std::move (clientMessage));
1428
+ GrpcMessagesToSend. Enqueue (std::move (clientMessage));
1417
1429
}
1418
1430
}
1419
1431
@@ -1475,6 +1487,7 @@ void TWriteSessionImpl::HandleWakeUpImpl() {
1475
1487
with_lock (self->Lock ) {
1476
1488
self->HandleWakeUpImpl ();
1477
1489
}
1490
+ self->SendGrpcMessages ();
1478
1491
}
1479
1492
};
1480
1493
if (TInstant::Now () - LastTokenUpdate > UPDATE_TOKEN_PERIOD) {
0 commit comments