This is an automated email from the ASF dual-hosted git repository. joscorbe pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
The following commit(s) were added to refs/heads/trunk by this push: new 432021bcce OAK-11737: Fix some properties not being properly passed to FullGC revisions command (#2307) 432021bcce is described below commit 432021bcce4293a5f571e9593d80b31dd52d4655 Author: José Andrés Cordero Benítez <josco...@users.noreply.github.com> AuthorDate: Mon Jun 23 14:19:04 2025 +0200 OAK-11737: Fix some properties not being properly passed to FullGC revisions command (#2307) * OAK-11737: Properly set embeddedVerification value on FullGC revisions command. * OAK-11737: Improved RevisionsCommand test cases. Output actual applied settings. Fix include/exclude paths. --- .../plugins/document/DocumentNodeStoreHelper.java | 4 ++- .../jackrabbit/oak/run/RevisionsCommand.java | 25 +++++++------- .../oak/plugins/document/RevisionsCommandTest.java | 22 ++++++++++--- .../oak/plugins/document/FullGCMode.java | 2 +- .../plugins/document/VersionGarbageCollector.java | 38 +++++++++++++++++++++- 5 files changed, 70 insertions(+), 21 deletions(-) diff --git a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreHelper.java b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreHelper.java index 1ef9956b6b..4443cee98b 100644 --- a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreHelper.java +++ b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreHelper.java @@ -72,10 +72,12 @@ public class DocumentNodeStoreHelper { public static VersionGarbageCollector createVersionGC(final DocumentNodeStore nodeStore, final VersionGCSupport gcSupport, boolean isFullGCDryRun, final DocumentNodeStoreBuilder<?> builder) { - return new VersionGarbageCollector(nodeStore, gcSupport, isFullGCEnabled(builder), isFullGCDryRun, + VersionGarbageCollector gc = new VersionGarbageCollector(nodeStore, gcSupport, isFullGCEnabled(builder), isFullGCDryRun, isEmbeddedVerificationEnabled(builder), builder.getFullGCMode(), builder.getFullGCDelayFactor(), builder.getFullGCBatchSize(), builder.getFullGCProgressSize(), builder.getFullGcMaxAgeMillis(), builder.getFullGCGeneration()); + gc.setFullGCPaths(builder.getFullGCIncludePaths(), builder.getFullGCExcludePaths()); + return gc; } public static DocumentNodeState readNode(DocumentNodeStore documentNodeStore, Path path, RevisionVector rootRevision) { diff --git a/oak-run/src/main/java/org/apache/jackrabbit/oak/run/RevisionsCommand.java b/oak-run/src/main/java/org/apache/jackrabbit/oak/run/RevisionsCommand.java index d992546861..c0210fedc1 100644 --- a/oak-run/src/main/java/org/apache/jackrabbit/oak/run/RevisionsCommand.java +++ b/oak-run/src/main/java/org/apache/jackrabbit/oak/run/RevisionsCommand.java @@ -411,9 +411,7 @@ public class RevisionsCommand implements Command { version); System.exit(1); } - if (options.isEmbeddedVerificationEnabled()) { - builder.setEmbeddedVerificationEnabled(true); - } + builder.setEmbeddedVerificationEnabled(options.isEmbeddedVerificationEnabled()); // set it read-only before the DocumentNodeStore is created // this prevents the DocumentNodeStore from writing a new // clusterId to the clusterNodes and nodes collections @@ -421,19 +419,19 @@ public class RevisionsCommand implements Command { useMemoryBlobStore(builder); // create a version GC that operates on a read-only DocumentNodeStore // and a GC support with a writable DocumentStore - System.out.println("DryRun is enabled : " + options.isDryRun()); - System.out.println("EmbeddedVerification is enabled : " + options.isEmbeddedVerificationEnabled()); + VersionGarbageCollector gc = createVersionGC(builder.build(), gcSupport, options.isDryRun(), builder); + System.out.println("DryRun is enabled : " + gc.isFullGCDryRun()); + System.out.println("EmbeddedVerification is enabled : " + gc.isEmbeddedVerificationEnabled()); System.out.println("ResetFullGC is enabled : " + options.isResetFullGC()); System.out.println("Compaction is enabled : " + options.doCompaction()); - System.out.println("IncludePaths are : " + Arrays.toString(options.getIncludePaths())); - System.out.println("ExcludePaths are : " + Arrays.toString(options.getExcludePaths())); - System.out.println("FullGcMode is : " + options.getFullGcMode()); - System.out.println("FullGcDelayFactory is : " + options.getFullGcDelayFactor()); - System.out.println("FullGcBatchSize is : " + options.getFullGcBatchSize()); - System.out.println("FullGcProgressSize is : " + options.getFullGcProgressSize()); + System.out.println("IncludePaths are : " + gc.getFullGCIncludePaths()); + System.out.println("ExcludePaths are : " + gc.getFullGCExcludePaths()); + System.out.println("FullGcMode is : " + VersionGarbageCollector.getFullGcMode()); + System.out.println("FullGcDelayFactor is : " + gc.getFullGcDelayFactor()); + System.out.println("FullGcBatchSize is : " + gc.getFullGcBatchSize()); + System.out.println("FullGcProgressSize is : " + gc.getFullGcProgressSize()); System.out.println("FullGcMaxAgeInSecs is : " + options.getFullGcMaxAge()); - System.out.println("FullGcMaxAgeMillis is : " + builder.getFullGcMaxAgeMillis()); - VersionGarbageCollector gc = createVersionGC(builder.build(), gcSupport, options.isDryRun(), builder); + System.out.println("FullGcMaxAgeMillis is : " + gc.getFullGcMaxAgeInMillis()); VersionGCOptions gcOptions = gc.getOptions(); gcOptions = gcOptions.withDelayFactor(options.getDelay()); @@ -654,6 +652,7 @@ public class RevisionsCommand implements Command { DocumentStore documentStore = builder.getDocumentStore(); builder.setReadOnlyMode(); useMemoryBlobStore(builder); + builder.setEmbeddedVerificationEnabled(options.isEmbeddedVerificationEnabled()); DocumentNodeStore documentNodeStore = builder.build(); VersionGarbageCollector gc = bootstrapVGC(options, closer, true); diff --git a/oak-run/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionsCommandTest.java b/oak-run/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionsCommandTest.java index 777dbad49e..3fc023b6f8 100644 --- a/oak-run/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionsCommandTest.java +++ b/oak-run/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionsCommandTest.java @@ -195,10 +195,10 @@ public class RevisionsCommandTest { assertTrue(output.contains("ResetFullGC is enabled : false\n")); assertTrue(output.contains("Compaction is enabled : false\n")); assertTrue(output.contains("starting gc collect\n")); - assertTrue(output.contains("IncludePaths are : [/]\n")); + assertTrue(output.contains("IncludePaths are : []\n")); assertTrue(output.contains("ExcludePaths are : []\n")); - assertTrue(output.contains("FullGcMode is : 0\n")); - assertTrue(output.contains("FullGcDelayFactory is : 2.0\n")); + assertTrue(output.contains("FullGcMode is : NONE\n")); + assertTrue(output.contains("FullGcDelayFactor is : 2.0\n")); assertTrue(output.contains("FullGcBatchSize is : 1000\n")); assertTrue(output.contains("FullGcProgressSize is : 10000\n")); assertTrue(output.contains("FullGcMaxAgeInSecs is : 86400\n")); @@ -220,7 +220,7 @@ public class RevisionsCommandTest { ns.dispose(); String output = captureSystemOut(new RevisionsCmd("fullGC", "--fullGcDelayFactor", "2.5", "--entireRepo")); - assertTrue(output.contains("FullGcDelayFactory is : 2.5\n")); + assertTrue(output.contains("FullGcDelayFactor is : 2.5\n")); assertTrue(output.contains("starting gc collect")); } @@ -251,7 +251,19 @@ public class RevisionsCommandTest { assertTrue(output.contains("ResetFullGC is enabled : false")); assertTrue(output.contains("Compaction is enabled : false")); assertTrue(output.contains("starting gc collect")); - assertTrue(output.contains("FullGcMode is : 3")); + assertTrue(output.contains("FullGcMode is : GAP_ORPHANS_EMPTYPROPS")); + } + + @Test + public void fullGCWithModeAllOrphans() { + ns.dispose(); + + String output = captureSystemOut(new RevisionsCmd("fullGC", "--entireRepo", "--fullGcMode", "4")); + assertTrue(output.contains("DryRun is enabled : true")); + assertTrue(output.contains("ResetFullGC is enabled : false")); + assertTrue(output.contains("Compaction is enabled : false")); + assertTrue(output.contains("starting gc collect")); + assertTrue(output.contains("FullGcMode is : ALL_ORPHANS_EMPTYPROPS")); } @Test diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/FullGCMode.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/FullGCMode.java index 6a69c2e8e4..aef5957a18 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/FullGCMode.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/FullGCMode.java @@ -27,7 +27,7 @@ import static org.slf4j.LoggerFactory.getLogger; * Ultimately the goal is to clean up all possible garbage. After hardening these modes * might no longer be supported. */ -enum FullGCMode { +public enum FullGCMode { /** * no full GC is done at all */ diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java index 0dee7fda80..d469ebba0c 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java @@ -172,9 +172,45 @@ public class VersionGarbageCollector { private static FullGCMode fullGcMode = GAP_ORPHANS_EMPTYPROPS; private final long fullGcGen; - static FullGCMode getFullGcMode() { + public static FullGCMode getFullGcMode() { return fullGcMode; } + + public boolean isFullGCEnabled() { + return fullGCEnabled; + } + + public boolean isFullGCDryRun() { + return isFullGCDryRun; + } + + public boolean isEmbeddedVerificationEnabled() { + return embeddedVerification; + } + + public double getFullGcDelayFactor() { + return fullGCDelayFactor; + } + + public long getFullGcMaxAgeInMillis() { + return fullGcMaxAgeInMillis; + } + + public int getFullGcBatchSize() { + return fullGCBatchSize; + } + + public int getFullGcProgressSize() { + return fullGCProgressSize; + } + + public Set<String> getFullGCIncludePaths() { + return fullGCIncludePaths; + } + + public Set<String> getFullGCExcludePaths() { + return fullGCExcludePaths; + } /** * Set the full GC mode to be used according to the provided configuration value.