This is an automated email from the ASF dual-hosted git repository.

daim 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 0063f98cd0 OAK-11439 : set remaining full gc modes (#2036)
0063f98cd0 is described below

commit 0063f98cd0d3b2c4dd02f21420771404a451416b
Author: Rishabh Kumar <[email protected]>
AuthorDate: Thu Jan 30 15:45:01 2025 +0530

    OAK-11439 : set remaining full gc modes (#2036)
    
    Co-authored-by: Rishabh Kumar <[email protected]>
---
 .../oak/plugins/document/FullGCMode.java           | 105 +++++++++++++++++++++
 .../plugins/document/VersionGarbageCollector.java  |  68 +------------
 .../oak/plugins/document/BranchCommitGCTest.java   |   1 -
 .../oak/plugins/document/FullGCHelper.java         |   1 -
 .../oak/plugins/document/VersionGCTest.java        |  54 ++++++++++-
 .../document/VersionGarbageCollectorIT.java        |   1 -
 6 files changed, 159 insertions(+), 71 deletions(-)

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
new file mode 100644
index 0000000000..03ba9cd48b
--- /dev/null
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/FullGCMode.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.document;
+
+import org.slf4j.Logger;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * During hardening of FullGC one can choose level type of garbage should be 
cleaned up.
+ * Ultimately the goal is to clean up all possible garbage. After hardening 
these modes
+ * might no longer be supported.
+ */
+enum FullGCMode {
+    /**
+     * no full GC is done at all
+     */
+    NONE,
+    /**
+     * GC only empty properties
+     */
+    EMPTYPROPS,
+    /**
+     * GC only orphaned nodes with gaps in ancestor docs
+     */
+    GAP_ORPHANS,
+    /**
+     * GC orphaned nodes with gaps in ancestor docs, plus empty properties
+     */
+    GAP_ORPHANS_EMPTYPROPS,
+    /**
+     * GC any kind of orphaned nodes, plus empty properties
+     */
+    ALL_ORPHANS_EMPTYPROPS,
+    /**
+     * GC any kind of orphaned nodes, empty properties plus keep 1 (== keep
+     * traversed) revision, applied to user properties only
+     */
+    ORPHANS_EMPTYPROPS_KEEP_ONE_USER_PROPS,
+    /**
+     * GC any kind of orphaned nodes, empty properties plus keep 1 (== keep
+     * traversed) revision, applied to all properties
+     */
+    ORPHANS_EMPTYPROPS_KEEP_ONE_ALL_PROPS,
+    /**
+     * GC any kind of orphaned nodes, empty properties plus cleanup unmerged 
BCs
+     */
+    ORPHANS_EMPTYPROPS_UNMERGED_BC,
+    /**
+     * GC any kind of orphaned nodes, empty properties plus cleanup revisions, 
also
+     * between checkpoints
+     */
+    ORPHANS_EMPTYPROPS_BETWEEN_CHECKPOINTS_NO_UNMERGED_BC,
+    /**
+     * GC any kind of orphaned nodes, empty properties, cleanup revisions, also
+     * between checkpoints, plus cleanup unmerged BCs
+     */
+    ORPHANS_EMPTYPROPS_BETWEEN_CHECKPOINTS_WITH_UNMERGED_BC;
+
+    private static final Logger log = getLogger(FullGCMode.class);
+
+    public static FullGCMode getMode(final int mode) {
+
+        switch (mode) {
+            case 1:
+                return EMPTYPROPS;
+            case 2:
+                return GAP_ORPHANS;
+            case 3:
+                return GAP_ORPHANS_EMPTYPROPS;
+            case 4:
+                return ALL_ORPHANS_EMPTYPROPS;
+            case 5:
+                return ORPHANS_EMPTYPROPS_KEEP_ONE_USER_PROPS;
+            case 6:
+                return ORPHANS_EMPTYPROPS_KEEP_ONE_ALL_PROPS;
+            case 7:
+                return ORPHANS_EMPTYPROPS_UNMERGED_BC;
+            case 8:
+                return ORPHANS_EMPTYPROPS_BETWEEN_CHECKPOINTS_NO_UNMERGED_BC;
+            case 9:
+                return ORPHANS_EMPTYPROPS_BETWEEN_CHECKPOINTS_WITH_UNMERGED_BC;
+            default:
+                log.warn("Unsupported full GC mode configuration value: {}. 
Resetting to NONE", mode);
+                return NONE;
+        }
+    }
+
+}
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 18c544a495..27c75e8337 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
@@ -93,10 +93,10 @@ import static 
org.apache.jackrabbit.oak.plugins.document.NodeDocument.REVISIONS;
 import static 
org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType.COMMIT_ROOT_ONLY;
 import static 
org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType.DEFAULT_LEAF;
 import static 
org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType.DEFAULT_NO_BRANCH;
-import static 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode.EMPTYPROPS;
-import static 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode.GAP_ORPHANS;
-import static 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode.GAP_ORPHANS_EMPTYPROPS;
-import static 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode.NONE;
+import static org.apache.jackrabbit.oak.plugins.document.FullGCMode.EMPTYPROPS;
+import static 
org.apache.jackrabbit.oak.plugins.document.FullGCMode.GAP_ORPHANS;
+import static 
org.apache.jackrabbit.oak.plugins.document.FullGCMode.GAP_ORPHANS_EMPTYPROPS;
+import static org.apache.jackrabbit.oak.plugins.document.FullGCMode.NONE;
 import static 
org.apache.jackrabbit.oak.plugins.document.util.Utils.getIdFromPath;
 import static 
org.apache.jackrabbit.oak.plugins.document.util.Utils.timestampToString;
 import static org.apache.jackrabbit.oak.stats.StatisticsProvider.NOOP;
@@ -157,48 +157,6 @@ public class VersionGarbageCollector {
      */
     static final String SETTINGS_COLLECTION_FULL_GC_DRY_RUN_DOCUMENT_ID_PROP = 
"fullGCDryRunId";
 
-    /**
-     * During hardening of FullGC one can choose level type of garbage should 
be cleaned up.
-     * Ultimately the goal is to clean up all possible garbage. After 
hardening these modes
-     * might no longer be supported.
-     */
-    enum FullGCMode {
-        /** no full GC is done at all */
-        NONE,
-        /** GC only empty properties */
-        EMPTYPROPS,
-        /** GC only orphaned nodes with gaps in ancestor docs */
-        GAP_ORPHANS,
-        /** GC orphaned nodes with gaps in ancestor docs, plus empty 
properties */
-        GAP_ORPHANS_EMPTYPROPS,
-        /** GC any kind of orphaned nodes, plus empty properties */
-        ALL_ORPHANS_EMPTYPROPS,
-        /**
-         * GC any kind of orphaned nodes, empty properties plus keep 1 (== keep
-         * traversed) revision, applied to user properties only
-         */
-        ORPHANS_EMPTYPROPS_KEEP_ONE_USER_PROPS,
-        /**
-         * GC any kind of orphaned nodes, empty properties plus keep 1 (== keep
-         * traversed) revision, applied to all properties
-         */
-        ORPHANS_EMPTYPROPS_KEEP_ONE_ALL_PROPS,
-        /**
-         * GC any kind of orphaned nodes, empty properties plus cleanup 
unmerged BCs
-         */
-        ORPHANS_EMPTYPROPS_UNMERGED_BC,
-        /**
-         * GC any kind of orphaned nodes, empty properties plus cleanup 
revisions, also
-         * between checkpoints
-         */
-        ORPHANS_EMPTYPROPS_BETWEEN_CHECKPOINTS_NO_UNMERGED_BC,
-        /**
-         * GC any kind of orphaned nodes, empty properties, cleanup revisions, 
also
-         * between checkpoints, plus cleanup unmerged BCs
-         */
-        ORPHANS_EMPTYPROPS_BETWEEN_CHECKPOINTS_WITH_UNMERGED_BC
-    }
-
     private static FullGCMode fullGcMode = GAP_ORPHANS_EMPTYPROPS;
 
     static FullGCMode getFullGcMode() {
@@ -212,23 +170,7 @@ public class VersionGarbageCollector {
      * @param fullGcMode configuration value for full GC mode
      */
     static void setFullGcMode(int fullGcMode) {
-        switch (fullGcMode) {
-            case 0:
-                VersionGarbageCollector.fullGcMode = NONE;
-                break;
-            case 1:
-                VersionGarbageCollector.fullGcMode = EMPTYPROPS;
-                break;
-            case 2:
-                VersionGarbageCollector.fullGcMode = GAP_ORPHANS;
-                break;
-            case 3:
-                VersionGarbageCollector.fullGcMode = GAP_ORPHANS_EMPTYPROPS;
-                break;
-            default:
-                log.warn("Unsupported full GC mode configuration value: {}. 
Resetting to NONE", fullGcMode);
-                VersionGarbageCollector.fullGcMode = NONE;
-        }
+        VersionGarbageCollector.fullGcMode = FullGCMode.getMode(fullGcMode);
     }
 
     private final DocumentNodeStore nodeStore;
diff --git 
a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BranchCommitGCTest.java
 
b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BranchCommitGCTest.java
index fc8921048e..95789f3eed 100644
--- 
a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BranchCommitGCTest.java
+++ 
b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BranchCommitGCTest.java
@@ -51,7 +51,6 @@ import java.util.SortedMap;
 import java.util.function.Consumer;
 
 import org.apache.jackrabbit.oak.plugins.document.DocumentMK.Builder;
-import 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode;
 import 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollectorIT.GCCounts;
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
diff --git 
a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/FullGCHelper.java
 
b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/FullGCHelper.java
index f75f180fe4..dc625d4320 100644
--- 
a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/FullGCHelper.java
+++ 
b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/FullGCHelper.java
@@ -18,7 +18,6 @@
  */
 package org.apache.jackrabbit.oak.plugins.document;
 
-import 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode;
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
diff --git 
a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCTest.java
 
b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCTest.java
index edb4bfd692..35fa216570 100644
--- 
a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCTest.java
+++ 
b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCTest.java
@@ -561,7 +561,7 @@ public class VersionGCTest {
 
     @Test
     public void testVersionGCLoadGCModeConfigurationNotApplicable() {
-        int fullGcModeNotAllowedValue = 5;
+        int fullGcModeNotAllowedValue = 15;
         int fullGcModeGapOrphans = 2;
 
         // set fullGcMode to allowed value that is different than NONE
@@ -573,7 +573,7 @@ public class VersionGCTest {
                 fullGcModeNotAllowedValue, 0, DEFAULT_FGC_BATCH_SIZE, 
DEFAULT_FGC_PROGRESS_SIZE);
 
         assertEquals("Starting VersionGarbageCollector with not applicable / 
not allowed value" +
-                "will set fullGcMode to default NONE", 
VersionGarbageCollector.FullGCMode.NONE, 
VersionGarbageCollector.getFullGcMode());
+                "will set fullGcMode to default NONE", FullGCMode.NONE, 
VersionGarbageCollector.getFullGcMode());
     }
 
     @Test
@@ -583,7 +583,7 @@ public class VersionGCTest {
                 ns, new VersionGCSupport(store), true, false, false,
                 fullGcModeNone, 0, DEFAULT_FGC_BATCH_SIZE, 
DEFAULT_FGC_PROGRESS_SIZE);
 
-        assertEquals(VersionGarbageCollector.FullGCMode.NONE, 
VersionGarbageCollector.getFullGcMode());
+        assertEquals(FullGCMode.NONE, VersionGarbageCollector.getFullGcMode());
     }
 
     @Test
@@ -593,7 +593,7 @@ public class VersionGCTest {
                 ns, new VersionGCSupport(store), true, false, false,
                 fullGcModeGapOrphans, 0, DEFAULT_FGC_BATCH_SIZE, 
DEFAULT_FGC_PROGRESS_SIZE);
 
-        assertEquals(VersionGarbageCollector.FullGCMode.GAP_ORPHANS, 
VersionGarbageCollector.getFullGcMode());
+        assertEquals(FullGCMode.GAP_ORPHANS, 
VersionGarbageCollector.getFullGcMode());
     }
 
     @Test
@@ -603,11 +603,55 @@ public class VersionGCTest {
                 ns, new VersionGCSupport(store), true, false, false,
                 fullGcModeGapOrphansEmptyProperties, 0, 
DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
 
-        
assertEquals(VersionGarbageCollector.FullGCMode.GAP_ORPHANS_EMPTYPROPS, 
VersionGarbageCollector.getFullGcMode());
+        assertEquals(FullGCMode.GAP_ORPHANS_EMPTYPROPS, 
VersionGarbageCollector.getFullGcMode());
     }
 
     // OAK-10896 END
 
+    // OAK-11439
+
+    @Test
+    public void testVersionGCLoadGCModeConfigurationAllOrphansEmptyProps() {
+        int fullGcModeAllOrphansEmptyProperties = 4;
+        VersionGarbageCollector gc = new VersionGarbageCollector(
+                ns, new VersionGCSupport(store), true, false, false,
+                fullGcModeAllOrphansEmptyProperties, 0, 
DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
+
+        assertEquals(FullGCMode.ALL_ORPHANS_EMPTYPROPS, 
VersionGarbageCollector.getFullGcMode());
+    }
+
+    @Test
+    public void 
testVersionGCLoadGCModeConfigurationAllOrphansEmptyPropsKeepOneUserProps() {
+        int fullGcModeAllOrphansEmptyPropertiesKeepOneUserProps = 5;
+        VersionGarbageCollector gc = new VersionGarbageCollector(
+                ns, new VersionGCSupport(store), true, false, false,
+                fullGcModeAllOrphansEmptyPropertiesKeepOneUserProps, 0, 
DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
+
+        assertEquals(FullGCMode.ORPHANS_EMPTYPROPS_KEEP_ONE_USER_PROPS, 
VersionGarbageCollector.getFullGcMode());
+    }
+
+    @Test
+    public void 
testVersionGCLoadGCModeConfigurationAllOrphansEmptyPropsKeepOneAllProps() {
+        int fullGcModeAllOrphansEmptyPropertiesKeepOneAllProps = 6;
+        VersionGarbageCollector gc = new VersionGarbageCollector(
+                ns, new VersionGCSupport(store), true, false, false,
+                fullGcModeAllOrphansEmptyPropertiesKeepOneAllProps, 0, 
DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
+
+        assertEquals(FullGCMode.ORPHANS_EMPTYPROPS_KEEP_ONE_ALL_PROPS, 
VersionGarbageCollector.getFullGcMode());
+    }
+
+    @Test
+    public void 
testVersionGCLoadGCModeConfigurationAllOrphansEmptyPropsUnmergedBC() {
+        int fullGcModeAllOrphansEmptyPropertiesUnmergedBC = 7;
+        VersionGarbageCollector gc = new VersionGarbageCollector(
+                ns, new VersionGCSupport(store), true, false, false,
+                fullGcModeAllOrphansEmptyPropertiesUnmergedBC, 0, 
DEFAULT_FGC_BATCH_SIZE, DEFAULT_FGC_PROGRESS_SIZE);
+
+        assertEquals(FullGCMode.ORPHANS_EMPTYPROPS_UNMERGED_BC, 
VersionGarbageCollector.getFullGcMode());
+    }
+
+    // OAK-11439 END
+
     private Future<VersionGCStats> gc() {
         // run gc in a separate thread
         return execService.submit(new Callable<VersionGCStats>() {
diff --git 
a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java
 
b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java
index 08aaea9cac..2988d50949 100644
--- 
a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java
+++ 
b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java
@@ -113,7 +113,6 @@ import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.collections.ListUtils;
 import 
org.apache.jackrabbit.oak.plugins.document.DocumentStoreFixture.RDBFixture;
 import 
org.apache.jackrabbit.oak.plugins.document.FailingDocumentStore.FailedUpdateOpListener;
-import 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.FullGCMode;
 import 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.VersionGCStats;
 import 
org.apache.jackrabbit.oak.plugins.document.bundlor.BundlingConfigInitializer;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoTestUtils;

Reply via email to