@@ -161,7 +161,7 @@ void TPartition::DumpKeysForBlobsCompaction() const
161
161
LOG_D (" ===================================" );
162
162
}
163
163
164
- void TPartition::TryRunCompaction ()
164
+ void TPartition::TryRunCompaction (bool force )
165
165
{
166
166
if (CompactionInProgress) {
167
167
LOG_D (" Blobs compaction in progress" );
@@ -174,12 +174,11 @@ void TPartition::TryRunCompaction()
174
174
}
175
175
176
176
// DumpKeysForBlobsCompaction();
177
- DumpZones (__FILE__, __LINE__);
178
177
179
178
const ui64 blobsKeyCountLimit = GetBodyKeysCountLimit ();
180
179
const ui64 compactedBlobSizeLowerBound = GetCompactedBlobSizeLowerBound ();
181
180
182
- if (BlobEncoder.DataKeysBody .size () >= blobsKeyCountLimit) {
181
+ if (( BlobEncoder.DataKeysBody .size () >= blobsKeyCountLimit) && !force ) {
183
182
CompactionInProgress = true ;
184
183
Send (SelfId (), new TEvPQ::TEvRunCompaction (BlobEncoder.DataKeysBody .size ()));
185
184
return ;
@@ -206,7 +205,7 @@ void TPartition::TryRunCompaction()
206
205
}
207
206
LOG_D (blobsCount << " keys were taken away. Let's read " << blobsSize << " bytes (" << totalSize << " )" );
208
207
209
- if (totalSize < GetCumulativeSizeLimit ()) {
208
+ if (( totalSize < GetCumulativeSizeLimit ()) && !force ) {
210
209
LOG_D (" Need more data for compaction. " <<
211
210
" Blobs " << BlobEncoder.DataKeysBody .size () <<
212
211
" , size " << totalSize << " (" << GetCumulativeSizeLimit () << " )" );
@@ -220,6 +219,11 @@ void TPartition::TryRunCompaction()
220
219
Send (SelfId (), new TEvPQ::TEvRunCompaction (blobsCount));
221
220
}
222
221
222
+ void TPartition::Handle (TEvPQ::TEvForceCompaction::TPtr&)
223
+ {
224
+ TryRunCompaction (true );
225
+ }
226
+
223
227
void TPartition::Handle (TEvPQ::TEvRunCompaction::TPtr& ev)
224
228
{
225
229
const ui64 blobsCount = ev->Get ()->BlobsCount ;
@@ -274,11 +278,14 @@ bool TPartition::CompactRequestedBlob(const TRequestedBlob& requestedBlob,
274
278
TMaybe<ui64> firstBlobOffset = requestedBlob.Offset ;
275
279
276
280
for (TBlobIterator it (requestedBlob.Key , requestedBlob.Value ); it.IsValid (); it.Next ()) {
281
+ LOG_D (" Compaction: case 18" );
277
282
TBatch batch = it.GetBatch ();
278
283
batch.Unpack ();
279
284
280
285
for (const auto & blob : batch.Blobs ) {
286
+ LOG_D (" Compaction: case 19" );
281
287
if (wasThePreviousBlobBig && blob.PartData && (blob.PartData ->PartNo != 0 )) {
288
+ LOG_D (" Compaction: case 20" );
282
289
// надо продолжить писать большое сообщение
283
290
CompactionBlobEncoder.NewHead .PartNo = blob.PartData ->PartNo ;
284
291
CompactionBlobEncoder.NewPartitionedBlob (Partition,
@@ -291,6 +298,8 @@ bool TPartition::CompactRequestedBlob(const TRequestedBlob& requestedBlob,
291
298
needToCompactHead,
292
299
MaxBlobSize,
293
300
blob.PartData ->PartNo );
301
+ } else {
302
+ LOG_D (" Compaction: case 21" );
294
303
}
295
304
wasThePreviousBlobBig = false ;
296
305
@@ -323,12 +332,17 @@ bool TPartition::CompactRequestedBlob(const TRequestedBlob& requestedBlob,
323
332
324
333
blobCreationUnixTime = std::max (blobCreationUnixTime, blob.WriteTimestamp );
325
334
if (!ExecRequestForCompaction (msg, parameters, compactionRequest, blobCreationUnixTime)) {
335
+ LOG_D (" Compaction: case 22" );
326
336
return false ;
337
+ } else {
338
+ LOG_D (" Compaction: case 23" );
327
339
}
328
340
329
341
firstBlobOffset = Nothing ();
330
342
}
343
+ LOG_D (" Compaction: case 25" );
331
344
}
345
+ LOG_D (" Compaction: case 26" );
332
346
333
347
return true ;
334
348
}
@@ -342,6 +356,7 @@ void TPartition::RenameCompactedBlob(TDataKey& k,
342
356
const auto & ctx = ActorContext ();
343
357
344
358
if (!CompactionBlobEncoder.PartitionedBlob .IsInited ()) {
359
+ LOG_D (" Compaction: case 12" );
345
360
CompactionBlobEncoder.NewPartitionedBlob (Partition,
346
361
CompactionBlobEncoder.NewHead .Offset ,
347
362
" " , // SourceId
@@ -351,22 +366,30 @@ void TPartition::RenameCompactedBlob(TDataKey& k,
351
366
parameters.HeadCleared , // headCleared
352
367
needToCompactHead, // needCompactHead
353
368
MaxBlobSize);
369
+ } else {
370
+ LOG_D (" Compaction: case 13" );
354
371
}
355
372
auto write = CompactionBlobEncoder.PartitionedBlob .Add (k.Key , size, k.Timestamp , false );
356
373
if (write && !write->Value .empty ()) {
374
+ LOG_D (" Compaction: case 14" );
357
375
// надо записать содержимое головы перед первым большим блобом
358
376
AddCmdWrite (write, compactionRequest, k.Timestamp , ctx);
359
377
CompactionBlobEncoder.CompactedKeys .emplace_back (write->Key , write->Value .size ());
378
+ } else {
379
+ LOG_D (" Compaction: case 15" );
360
380
}
361
381
362
382
if (const auto & formedBlobs = CompactionBlobEncoder.PartitionedBlob .GetFormedBlobs (); !formedBlobs.empty ()) {
383
+ LOG_D (" Compaction: case 16" );
363
384
ui32 curWrites = RenameTmpCmdWrites (compactionRequest);
364
385
RenameFormedBlobs (formedBlobs,
365
386
parameters,
366
387
curWrites,
367
388
compactionRequest,
368
389
CompactionBlobEncoder,
369
390
ctx);
391
+ } else {
392
+ LOG_D (" Compaction: case 17" );
370
393
}
371
394
372
395
k.BlobKeyToken ->NeedDelete = false ;
@@ -389,8 +412,11 @@ void TPartition::BlobsForCompactionWereRead(const TVector<NPQ::TRequestedBlob>&
389
412
if (!CompactionBlobEncoder.Head .GetCount () &&
390
413
!CompactionBlobEncoder.NewHead .GetCount () &&
391
414
CompactionBlobEncoder.IsEmpty ()) {
415
+ LOG_D (" Compaction: case 09" );
392
416
// если это первое сообщение, то надо поправить StartOffset
393
417
CompactionBlobEncoder.StartOffset = BlobEncoder.StartOffset ;
418
+ } else {
419
+ LOG_D (" Compaction: case 10" );
394
420
}
395
421
396
422
CompactionBlobEncoder.NewHead .Clear ();
@@ -412,15 +438,20 @@ void TPartition::BlobsForCompactionWereRead(const TVector<NPQ::TRequestedBlob>&
412
438
DumpZones (__FILE__, __LINE__);
413
439
414
440
for (size_t i = 0 ; i < KeysForCompaction.size (); ++i) {
441
+ LOG_D (" Compaction: case 11" );
415
442
auto & [k, pos] = KeysForCompaction[i];
416
443
bool needToCompactHead = (parameters.CurOffset < k.Key .GetOffset ());
417
444
418
445
if (pos == Max<size_t >()) {
446
+ LOG_D (" Compaction: case 01" );
419
447
// большой блоб надо переименовать
420
448
LOG_D (" Rename key " << k.Key .ToString ());
421
449
422
450
if (!WasTheLastBlobBig) {
451
+ LOG_D (" Compaction: case 02" );
423
452
needToCompactHead = true ;
453
+ } else {
454
+ LOG_D (" Compaction: case 03" );
424
455
}
425
456
LOG_D (" Need to compact head " << needToCompactHead);
426
457
@@ -440,32 +471,41 @@ void TPartition::BlobsForCompactionWereRead(const TVector<NPQ::TRequestedBlob>&
440
471
441
472
WasTheLastBlobBig = true ;
442
473
} else {
474
+ LOG_D (" Compaction: case 04" );
443
475
// маленький блоб надо дописать
444
476
LOG_D (" Append blob for key " << k.Key .ToString ());
445
477
LOG_D (" Need to compact head " << needToCompactHead);
446
478
447
479
const TRequestedBlob& requestedBlob = blobs[pos];
448
480
if (!CompactRequestedBlob (requestedBlob, parameters, needToCompactHead, compactionRequest.Get (), blobCreationUnixTime, WasTheLastBlobBig)) {
481
+ LOG_D (" Compaction: case 05" );
449
482
LOG_D (" Can't append blob for key " << k.Key .ToString ());
450
483
Y_FAIL (" Something went wrong" );
451
484
return ;
485
+ } else {
486
+ LOG_D (" Compaction: case 06" );
452
487
}
453
488
454
489
WasTheLastBlobBig = false ;
455
490
}
456
491
457
492
DumpZones (__FILE__, __LINE__);
458
493
}
494
+ LOG_D (" Compaction: case 24" );
459
495
460
496
if (!CompactionBlobEncoder.IsLastBatchPacked ()) {
497
+ LOG_D (" Compaction: case 07" );
461
498
CompactionBlobEncoder.PackLastBatch ();
499
+ } else {
500
+ LOG_D (" Compaction: case 08" );
462
501
}
463
502
464
503
CompactionBlobEncoder.HeadCleared = parameters.HeadCleared ;
465
504
466
505
EndProcessWritesForCompaction (compactionRequest.Get (), blobCreationUnixTime, ctx);
467
506
468
507
DumpZones (__FILE__, __LINE__);
508
+
469
509
// for debugging purposes
470
510
DumpKeyValueRequest (compactionRequest->Record );
471
511
0 commit comments