@@ -1212,6 +1212,11 @@ size_t TWriteSessionImpl::WriteBatchImpl() {
1212
1212
TBlock block{};
1213
1213
for (; block.OriginalSize < MaxBlockSize && i != CurrentBatch.Messages .size (); ++i) {
1214
1214
auto & currMessage = CurrentBatch.Messages [i];
1215
+
1216
+ // If MaxBlockSize or MaxBlockMessageCount values are ever changed from infinity and 1 correspondingly,
1217
+ // create a new block, if the existing one is non-empty AND (adding another message will overflow it OR
1218
+ // its codec is different from the codec of the next message).
1219
+
1215
1220
auto id = currMessage.Id ;
1216
1221
auto createTs = currMessage.CreatedAt ;
1217
1222
@@ -1303,22 +1308,26 @@ void TWriteSessionImpl::UpdateTokenIfNeededImpl() {
1303
1308
void TWriteSessionImpl::SendImpl () {
1304
1309
Y_ABORT_UNLESS (Lock.IsLocked ());
1305
1310
1306
- // External cycle splits ready blocks into multiple gRPC messages. Current gRPC message size hard limit is 64MiB
1307
- while (IsReadyToSendNextImpl ()) {
1311
+ // External cycle splits ready blocks into multiple gRPC messages. Current gRPC message size hard limit is 64MiB.
1312
+ while (IsReadyToSendNextImpl ()) {
1308
1313
TClientMessage clientMessage;
1309
1314
auto * writeRequest = clientMessage.mutable_write_request ();
1310
1315
1311
- // Sent blocks while we can without messages reordering
1316
+ ui32 prevCodec = 0 ;
1317
+ // Send blocks while we can without messages reordering.
1312
1318
while (IsReadyToSendNextImpl () && clientMessage.ByteSizeLong () < GetMaxGrpcMessageSize ()) {
1313
1319
const auto & block = PackedMessagesToSend.top ();
1314
1320
Y_ABORT_UNLESS (block.Valid );
1321
+ if (writeRequest->messages_size () > 0 && prevCodec != block.CodecID ) {
1322
+ break ;
1323
+ }
1324
+ prevCodec = block.CodecID ;
1315
1325
writeRequest->set_codec (static_cast <i32 >(block.CodecID ));
1316
1326
Y_ABORT_UNLESS (block.MessageCount == 1 );
1317
1327
for (size_t i = 0 ; i != block.MessageCount ; ++i) {
1318
1328
Y_ABORT_UNLESS (!OriginalMessagesToSend.empty ());
1319
1329
1320
1330
auto & message = OriginalMessagesToSend.front ();
1321
-
1322
1331
auto * msgData = writeRequest->add_messages ();
1323
1332
1324
1333
if (message.Tx ) {
@@ -1329,27 +1338,24 @@ void TWriteSessionImpl::SendImpl() {
1329
1338
msgData->set_seq_no (GetSeqNoImpl (message.Id ));
1330
1339
*msgData->mutable_created_at () = ::google::protobuf::util::TimeUtil::MillisecondsToTimestamp (message.CreatedAt .MilliSeconds ());
1331
1340
1332
- if (!message.MessageMeta .empty ()) {
1333
- for (auto & [k, v] : message.MessageMeta ) {
1334
- auto * pair = msgData->add_metadata_items ();
1335
- pair->set_key (k);
1336
- pair->set_value (v);
1337
- }
1341
+ for (auto & [k, v] : message.MessageMeta ) {
1342
+ auto * pair = msgData->add_metadata_items ();
1343
+ pair->set_key (k);
1344
+ pair->set_value (v);
1338
1345
}
1339
1346
SentOriginalMessages.emplace (std::move (message));
1340
1347
OriginalMessagesToSend.pop ();
1341
1348
1342
1349
msgData->set_uncompressed_size (block.OriginalSize );
1343
- if (block.Compressed )
1350
+ if (block.Compressed ) {
1344
1351
msgData->set_data (block.Data .data (), block.Data .size ());
1345
- else {
1352
+ } else {
1346
1353
for (auto & buffer: block.OriginalDataRefs ) {
1347
1354
msgData->set_data (buffer.data (), buffer.size ());
1348
1355
}
1349
1356
}
1350
1357
}
1351
1358
1352
-
1353
1359
TBlock moveBlock;
1354
1360
moveBlock.Move (block);
1355
1361
SentPackedMessage.emplace (std::move (moveBlock));
0 commit comments