@@ -161,7 +161,7 @@ void TPartition::DumpKeysForBlobsCompaction() const
161161 LOG_D (" ===================================" );
162162}
163163
164- void TPartition::TryRunCompaction ()
164+ void TPartition::TryRunCompaction (bool force )
165165{
166166 if (CompactionInProgress) {
167167 LOG_D (" Blobs compaction in progress" );
@@ -174,12 +174,11 @@ void TPartition::TryRunCompaction()
174174 }
175175
176176 // DumpKeysForBlobsCompaction();
177- DumpZones (__FILE__, __LINE__);
178177
179178 const ui64 blobsKeyCountLimit = GetBodyKeysCountLimit ();
180179 const ui64 compactedBlobSizeLowerBound = GetCompactedBlobSizeLowerBound ();
181180
182- if (BlobEncoder.DataKeysBody .size () >= blobsKeyCountLimit) {
181+ if (( BlobEncoder.DataKeysBody .size () >= blobsKeyCountLimit) && !force ) {
183182 CompactionInProgress = true ;
184183 Send (SelfId (), new TEvPQ::TEvRunCompaction (BlobEncoder.DataKeysBody .size ()));
185184 return ;
@@ -206,7 +205,7 @@ void TPartition::TryRunCompaction()
206205 }
207206 LOG_D (blobsCount << " keys were taken away. Let's read " << blobsSize << " bytes (" << totalSize << " )" );
208207
209- if (totalSize < GetCumulativeSizeLimit ()) {
208+ if (( totalSize < GetCumulativeSizeLimit ()) && !force ) {
210209 LOG_D (" Need more data for compaction. " <<
211210 " Blobs " << BlobEncoder.DataKeysBody .size () <<
212211 " , size " << totalSize << " (" << GetCumulativeSizeLimit () << " )" );
@@ -220,6 +219,11 @@ void TPartition::TryRunCompaction()
220219 Send (SelfId (), new TEvPQ::TEvRunCompaction (blobsCount));
221220}
222221
222+ void TPartition::Handle (TEvPQ::TEvForceCompaction::TPtr&)
223+ {
224+ TryRunCompaction (true );
225+ }
226+
223227void TPartition::Handle (TEvPQ::TEvRunCompaction::TPtr& ev)
224228{
225229 const ui64 blobsCount = ev->Get ()->BlobsCount ;
@@ -274,11 +278,14 @@ bool TPartition::CompactRequestedBlob(const TRequestedBlob& requestedBlob,
274278 TMaybe<ui64> firstBlobOffset = requestedBlob.Offset ;
275279
276280 for (TBlobIterator it (requestedBlob.Key , requestedBlob.Value ); it.IsValid (); it.Next ()) {
281+ LOG_D (" Compaction: case 18" );
277282 TBatch batch = it.GetBatch ();
278283 batch.Unpack ();
279284
280285 for (const auto & blob : batch.Blobs ) {
286+ LOG_D (" Compaction: case 19" );
281287 if (wasThePreviousBlobBig && blob.PartData && (blob.PartData ->PartNo != 0 )) {
288+ LOG_D (" Compaction: case 20" );
282289 // надо продолжить писать большое сообщение
283290 CompactionBlobEncoder.NewHead .PartNo = blob.PartData ->PartNo ;
284291 CompactionBlobEncoder.NewPartitionedBlob (Partition,
@@ -291,6 +298,8 @@ bool TPartition::CompactRequestedBlob(const TRequestedBlob& requestedBlob,
291298 needToCompactHead,
292299 MaxBlobSize,
293300 blob.PartData ->PartNo );
301+ } else {
302+ LOG_D (" Compaction: case 21" );
294303 }
295304 wasThePreviousBlobBig = false ;
296305
@@ -323,12 +332,17 @@ bool TPartition::CompactRequestedBlob(const TRequestedBlob& requestedBlob,
323332
324333 blobCreationUnixTime = std::max (blobCreationUnixTime, blob.WriteTimestamp );
325334 if (!ExecRequestForCompaction (msg, parameters, compactionRequest, blobCreationUnixTime)) {
335+ LOG_D (" Compaction: case 22" );
326336 return false ;
337+ } else {
338+ LOG_D (" Compaction: case 23" );
327339 }
328340
329341 firstBlobOffset = Nothing ();
330342 }
343+ LOG_D (" Compaction: case 25" );
331344 }
345+ LOG_D (" Compaction: case 26" );
332346
333347 return true ;
334348}
@@ -342,6 +356,7 @@ void TPartition::RenameCompactedBlob(TDataKey& k,
342356 const auto & ctx = ActorContext ();
343357
344358 if (!CompactionBlobEncoder.PartitionedBlob .IsInited ()) {
359+ LOG_D (" Compaction: case 12" );
345360 CompactionBlobEncoder.NewPartitionedBlob (Partition,
346361 CompactionBlobEncoder.NewHead .Offset ,
347362 " " , // SourceId
@@ -351,22 +366,30 @@ void TPartition::RenameCompactedBlob(TDataKey& k,
351366 parameters.HeadCleared , // headCleared
352367 needToCompactHead, // needCompactHead
353368 MaxBlobSize);
369+ } else {
370+ LOG_D (" Compaction: case 13" );
354371 }
355372 auto write = CompactionBlobEncoder.PartitionedBlob .Add (k.Key , size, k.Timestamp , false );
356373 if (write && !write->Value .empty ()) {
374+ LOG_D (" Compaction: case 14" );
357375 // надо записать содержимое головы перед первым большим блобом
358376 AddCmdWrite (write, compactionRequest, k.Timestamp , ctx);
359377 CompactionBlobEncoder.CompactedKeys .emplace_back (write->Key , write->Value .size ());
378+ } else {
379+ LOG_D (" Compaction: case 15" );
360380 }
361381
362382 if (const auto & formedBlobs = CompactionBlobEncoder.PartitionedBlob .GetFormedBlobs (); !formedBlobs.empty ()) {
383+ LOG_D (" Compaction: case 16" );
363384 ui32 curWrites = RenameTmpCmdWrites (compactionRequest);
364385 RenameFormedBlobs (formedBlobs,
365386 parameters,
366387 curWrites,
367388 compactionRequest,
368389 CompactionBlobEncoder,
369390 ctx);
391+ } else {
392+ LOG_D (" Compaction: case 17" );
370393 }
371394
372395 k.BlobKeyToken ->NeedDelete = false ;
@@ -389,8 +412,11 @@ void TPartition::BlobsForCompactionWereRead(const TVector<NPQ::TRequestedBlob>&
389412 if (!CompactionBlobEncoder.Head .GetCount () &&
390413 !CompactionBlobEncoder.NewHead .GetCount () &&
391414 CompactionBlobEncoder.IsEmpty ()) {
415+ LOG_D (" Compaction: case 09" );
392416 // если это первое сообщение, то надо поправить StartOffset
393417 CompactionBlobEncoder.StartOffset = BlobEncoder.StartOffset ;
418+ } else {
419+ LOG_D (" Compaction: case 10" );
394420 }
395421
396422 CompactionBlobEncoder.NewHead .Clear ();
@@ -412,15 +438,20 @@ void TPartition::BlobsForCompactionWereRead(const TVector<NPQ::TRequestedBlob>&
412438 DumpZones (__FILE__, __LINE__);
413439
414440 for (size_t i = 0 ; i < KeysForCompaction.size (); ++i) {
441+ LOG_D (" Compaction: case 11" );
415442 auto & [k, pos] = KeysForCompaction[i];
416443 bool needToCompactHead = (parameters.CurOffset < k.Key .GetOffset ());
417444
418445 if (pos == Max<size_t >()) {
446+ LOG_D (" Compaction: case 01" );
419447 // большой блоб надо переименовать
420448 LOG_D (" Rename key " << k.Key .ToString ());
421449
422450 if (!WasTheLastBlobBig) {
451+ LOG_D (" Compaction: case 02" );
423452 needToCompactHead = true ;
453+ } else {
454+ LOG_D (" Compaction: case 03" );
424455 }
425456 LOG_D (" Need to compact head " << needToCompactHead);
426457
@@ -440,32 +471,41 @@ void TPartition::BlobsForCompactionWereRead(const TVector<NPQ::TRequestedBlob>&
440471
441472 WasTheLastBlobBig = true ;
442473 } else {
474+ LOG_D (" Compaction: case 04" );
443475 // маленький блоб надо дописать
444476 LOG_D (" Append blob for key " << k.Key .ToString ());
445477 LOG_D (" Need to compact head " << needToCompactHead);
446478
447479 const TRequestedBlob& requestedBlob = blobs[pos];
448480 if (!CompactRequestedBlob (requestedBlob, parameters, needToCompactHead, compactionRequest.Get (), blobCreationUnixTime, WasTheLastBlobBig)) {
481+ LOG_D (" Compaction: case 05" );
449482 LOG_D (" Can't append blob for key " << k.Key .ToString ());
450483 Y_FAIL (" Something went wrong" );
451484 return ;
485+ } else {
486+ LOG_D (" Compaction: case 06" );
452487 }
453488
454489 WasTheLastBlobBig = false ;
455490 }
456491
457492 DumpZones (__FILE__, __LINE__);
458493 }
494+ LOG_D (" Compaction: case 24" );
459495
460496 if (!CompactionBlobEncoder.IsLastBatchPacked ()) {
497+ LOG_D (" Compaction: case 07" );
461498 CompactionBlobEncoder.PackLastBatch ();
499+ } else {
500+ LOG_D (" Compaction: case 08" );
462501 }
463502
464503 CompactionBlobEncoder.HeadCleared = parameters.HeadCleared ;
465504
466505 EndProcessWritesForCompaction (compactionRequest.Get (), blobCreationUnixTime, ctx);
467506
468507 DumpZones (__FILE__, __LINE__);
508+
469509 // for debugging purposes
470510 DumpKeyValueRequest (compactionRequest->Record );
471511
0 commit comments