@@ -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) && (BlobEncoder.GetSize () < GetCumulativeSizeLimit ())) {
181
+ if ((BlobEncoder.DataKeysBody .size () < blobsKeyCountLimit) && (BlobEncoder.GetSize () < GetCumulativeSizeLimit ()) && !force ) {
183
182
LOG_D (" No data for blobs compaction" );
184
183
return ;
185
184
}
@@ -200,13 +199,19 @@ void TPartition::TryRunCompaction()
200
199
LOG_D (" Blob key for rename " << k.Key .ToString ());
201
200
}
202
201
}
202
+
203
203
LOG_D (blobsCount << " keys were taken away. Let's read " << blobsSize << " bytes" );
204
204
205
205
CompactionInProgress = true ;
206
206
207
207
Send (SelfId (), new TEvPQ::TEvRunCompaction (blobsCount));
208
208
}
209
209
210
+ void TPartition::Handle (TEvPQ::TEvForceCompaction::TPtr&)
211
+ {
212
+ TryRunCompaction (true );
213
+ }
214
+
210
215
void TPartition::Handle (TEvPQ::TEvRunCompaction::TPtr& ev)
211
216
{
212
217
const ui64 blobsCount = ev->Get ()->BlobsCount ;
@@ -261,11 +266,14 @@ bool TPartition::CompactRequestedBlob(const TRequestedBlob& requestedBlob,
261
266
TMaybe<ui64> firstBlobOffset = requestedBlob.Offset ;
262
267
263
268
for (TBlobIterator it (requestedBlob.Key , requestedBlob.Value ); it.IsValid (); it.Next ()) {
269
+ LOG_D (" Compaction: case 18" );
264
270
TBatch batch = it.GetBatch ();
265
271
batch.Unpack ();
266
272
267
273
for (const auto & blob : batch.Blobs ) {
274
+ LOG_D (" Compaction: case 19" );
268
275
if (wasThePreviousBlobBig && blob.PartData && (blob.PartData ->PartNo != 0 )) {
276
+ LOG_D (" Compaction: case 20" );
269
277
// надо продолжить писать большое сообщение
270
278
CompactionBlobEncoder.NewHead .PartNo = blob.PartData ->PartNo ;
271
279
CompactionBlobEncoder.NewPartitionedBlob (Partition,
@@ -278,6 +286,8 @@ bool TPartition::CompactRequestedBlob(const TRequestedBlob& requestedBlob,
278
286
needToCompactHead,
279
287
MaxBlobSize,
280
288
blob.PartData ->PartNo );
289
+ } else {
290
+ LOG_D (" Compaction: case 21" );
281
291
}
282
292
wasThePreviousBlobBig = false ;
283
293
@@ -310,12 +320,17 @@ bool TPartition::CompactRequestedBlob(const TRequestedBlob& requestedBlob,
310
320
311
321
blobCreationUnixTime = std::max (blobCreationUnixTime, blob.WriteTimestamp );
312
322
if (!ExecRequestForCompaction (msg, parameters, compactionRequest, blobCreationUnixTime)) {
323
+ LOG_D (" Compaction: case 22" );
313
324
return false ;
325
+ } else {
326
+ LOG_D (" Compaction: case 23" );
314
327
}
315
328
316
329
firstBlobOffset = Nothing ();
317
330
}
331
+ LOG_D (" Compaction: case 25" );
318
332
}
333
+ LOG_D (" Compaction: case 26" );
319
334
320
335
return true ;
321
336
}
@@ -329,6 +344,7 @@ void TPartition::RenameCompactedBlob(TDataKey& k,
329
344
const auto & ctx = ActorContext ();
330
345
331
346
if (!CompactionBlobEncoder.PartitionedBlob .IsInited ()) {
347
+ LOG_D (" Compaction: case 12" );
332
348
CompactionBlobEncoder.NewPartitionedBlob (Partition,
333
349
CompactionBlobEncoder.NewHead .Offset ,
334
350
" " , // SourceId
@@ -338,22 +354,30 @@ void TPartition::RenameCompactedBlob(TDataKey& k,
338
354
parameters.HeadCleared , // headCleared
339
355
needToCompactHead, // needCompactHead
340
356
MaxBlobSize);
357
+ } else {
358
+ LOG_D (" Compaction: case 13" );
341
359
}
342
360
auto write = CompactionBlobEncoder.PartitionedBlob .Add (k.Key , size, k.Timestamp , false );
343
361
if (write && !write->Value .empty ()) {
362
+ LOG_D (" Compaction: case 14" );
344
363
// надо записать содержимое головы перед первым большим блобом
345
364
AddCmdWrite (write, compactionRequest, k.Timestamp , ctx);
346
365
CompactionBlobEncoder.CompactedKeys .emplace_back (write->Key , write->Value .size ());
366
+ } else {
367
+ LOG_D (" Compaction: case 15" );
347
368
}
348
369
349
370
if (const auto & formedBlobs = CompactionBlobEncoder.PartitionedBlob .GetFormedBlobs (); !formedBlobs.empty ()) {
371
+ LOG_D (" Compaction: case 16" );
350
372
ui32 curWrites = RenameTmpCmdWrites (compactionRequest);
351
373
RenameFormedBlobs (formedBlobs,
352
374
parameters,
353
375
curWrites,
354
376
compactionRequest,
355
377
CompactionBlobEncoder,
356
378
ctx);
379
+ } else {
380
+ LOG_D (" Compaction: case 17" );
357
381
}
358
382
359
383
k.BlobKeyToken ->NeedDelete = false ;
@@ -376,8 +400,11 @@ void TPartition::BlobsForCompactionWereRead(const TVector<NPQ::TRequestedBlob>&
376
400
if (!CompactionBlobEncoder.Head .GetCount () &&
377
401
!CompactionBlobEncoder.NewHead .GetCount () &&
378
402
CompactionBlobEncoder.IsEmpty ()) {
403
+ LOG_D (" Compaction: case 09" );
379
404
// если это первое сообщение, то надо поправить StartOffset
380
405
CompactionBlobEncoder.StartOffset = BlobEncoder.StartOffset ;
406
+ } else {
407
+ LOG_D (" Compaction: case 10" );
381
408
}
382
409
383
410
CompactionBlobEncoder.NewHead .Clear ();
@@ -399,15 +426,20 @@ void TPartition::BlobsForCompactionWereRead(const TVector<NPQ::TRequestedBlob>&
399
426
DumpZones (__FILE__, __LINE__);
400
427
401
428
for (size_t i = 0 ; i < KeysForCompaction.size (); ++i) {
429
+ LOG_D (" Compaction: case 11" );
402
430
auto & [k, pos] = KeysForCompaction[i];
403
431
bool needToCompactHead = (parameters.CurOffset < k.Key .GetOffset ());
404
432
405
433
if (pos == Max<size_t >()) {
434
+ LOG_D (" Compaction: case 01" );
406
435
// большой блоб надо переименовать
407
436
LOG_D (" Rename key " << k.Key .ToString ());
408
437
409
438
if (!WasTheLastBlobBig) {
439
+ LOG_D (" Compaction: case 02" );
410
440
needToCompactHead = true ;
441
+ } else {
442
+ LOG_D (" Compaction: case 03" );
411
443
}
412
444
LOG_D (" Need to compact head " << needToCompactHead);
413
445
@@ -427,32 +459,41 @@ void TPartition::BlobsForCompactionWereRead(const TVector<NPQ::TRequestedBlob>&
427
459
428
460
WasTheLastBlobBig = true ;
429
461
} else {
462
+ LOG_D (" Compaction: case 04" );
430
463
// маленький блоб надо дописать
431
464
LOG_D (" Append blob for key " << k.Key .ToString ());
432
465
LOG_D (" Need to compact head " << needToCompactHead);
433
466
434
467
const TRequestedBlob& requestedBlob = blobs[pos];
435
468
if (!CompactRequestedBlob (requestedBlob, parameters, needToCompactHead, compactionRequest.Get (), blobCreationUnixTime, WasTheLastBlobBig)) {
469
+ LOG_D (" Compaction: case 05" );
436
470
LOG_D (" Can't append blob for key " << k.Key .ToString ());
437
471
Y_FAIL (" Something went wrong" );
438
472
return ;
473
+ } else {
474
+ LOG_D (" Compaction: case 06" );
439
475
}
440
476
441
477
WasTheLastBlobBig = false ;
442
478
}
443
479
444
480
DumpZones (__FILE__, __LINE__);
445
481
}
482
+ LOG_D (" Compaction: case 24" );
446
483
447
484
if (!CompactionBlobEncoder.IsLastBatchPacked ()) {
485
+ LOG_D (" Compaction: case 07" );
448
486
CompactionBlobEncoder.PackLastBatch ();
487
+ } else {
488
+ LOG_D (" Compaction: case 08" );
449
489
}
450
490
451
491
CompactionBlobEncoder.HeadCleared = parameters.HeadCleared ;
452
492
453
493
EndProcessWritesForCompaction (compactionRequest.Get (), blobCreationUnixTime, ctx);
454
494
455
495
DumpZones (__FILE__, __LINE__);
496
+
456
497
// for debugging purposes
457
498
DumpKeyValueRequest (compactionRequest->Record );
458
499
0 commit comments