Rishabh Daim created OAK-12119:
----------------------------------

             Summary: Offline Compaction does not persist compacted head into 
gc.log
                 Key: OAK-12119
                 URL: https://issues.apache.org/jira/browse/OAK-12119
             Project: Jackrabbit Oak
          Issue Type: Bug
            Reporter: Rishabh Daim
            Assignee: Rishabh Daim


*Root Cause*

 The offline compaction in *Compact.run()* calls *compactFull()* and 
*cleanup()* as two separate calls, but the _CompactionResult_ from compaction 
is silently discarded between them.

 

*Call chain:*

  Compact.run()
    ├─ store.compactFull()
    │    └─ garbageCollector.compactFull(strategy).isSuccess()
    │                                              ^^^^^^^^^^^
    │         CompactionResult.succeeded(...) is returned but thrown away!
    │
    └─ store.cleanup()
         └─ garbageCollector.cleanup(strategy)
              └─ strategy.cleanup(context)   ← no-arg overload
                   └─ AbstractGarbageCollectionStrategy.cleanup(Context):
                        return cleanup(context, CompactionResult.skipped(...))
                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                                Always creates a SKIPPED result!

 

Why *gc.log* is never written:

  In *AbstractGarbageCollectionStrategy.java:88–95:*
  // Standalone cleanup always creates a SKIPPED result
 
{code:java}
public List<String> cleanup(Context context) throws IOException {
      return cleanup(context, CompactionResult.skipped(...));
  }{code}
  *CompactionResult.skipped(...)* inherits *requiresGCJournalEntry()* from the 
base class, which returns false (line 216).

Then in *newCleanupStrategyContext()* at line 295–297:
 
{code:java}
public GCJournal getGCJournal()

{       return compactionResult.requiresGCJournalEntry() ? 
context.getGCJournal() : null;       //  ↑ false for skipped → returns null!   
}{code}
  *DefaultCleanupStrategy* receives null for gcJournal, so it skips the 
gcJournal.persist(...) call entirely.

  Contrast with online (integrated) GC:

The *AbstractGarbageCollectionStrategy.run()* method calls *cleanup(context, 
compactionResult)* with the actual *CompactionResult.succeeded(...)* — that's 
why gc.log works online
  but not offline.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to