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

joscorbe pushed a commit to branch OAK-10915
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit 1d700cfb1c6673593c2ec8be5f84d7d6e6236f25
Author: Jose Cordero <[email protected]>
AuthorDate: Mon Jun 24 17:06:47 2024 +0200

    OAK-10915: Avoid deleting expired checkpoints when running FullGC on a 
read-only NodeStore
---
 .../oak/plugins/document/Checkpoints.java          |  4 +++
 .../plugins/document/VersionGCRecommendations.java | 36 +++++++++++++++++++++-
 2 files changed, 39 insertions(+), 1 deletion(-)

diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Checkpoints.java
 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Checkpoints.java
index e57a75258d..eab4de94a9 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Checkpoints.java
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Checkpoints.java
@@ -204,6 +204,10 @@ class Checkpoints {
         return rv;
     }
 
+    DocumentNodeStore getNodeStore() {
+        return nodeStore;
+    }
+
     void setInfoProperty(@NotNull String checkpoint, @NotNull String key, 
@Nullable String value) {
         Revision r = Revision.fromString(checkNotNull(checkpoint));
         Info info = getCheckpoints().get(r);
diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGCRecommendations.java
 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGCRecommendations.java
index 6ee38b4925..b66f3fb420 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGCRecommendations.java
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGCRecommendations.java
@@ -20,15 +20,18 @@ package org.apache.jackrabbit.oak.plugins.document;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.SortedMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
 import 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.VersionGCStats;
+import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStore;
 import org.apache.jackrabbit.oak.plugins.document.util.TimeInterval;
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
 import org.apache.jackrabbit.oak.stats.Clock;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -223,7 +226,12 @@ public class VersionGCRecommendations {
         }
 
         //Check for any registered checkpoint which prevent the GC from running
-        Revision checkpoint = checkpoints.getOldestRevisionToKeep();
+        Revision checkpoint;
+        if (checkpoints.getNodeStore().isReadOnlyMode()) {
+            checkpoint = getLastAliveRevision(clock, checkpoints);
+        } else {
+            checkpoint = checkpoints.getOldestRevisionToKeep();
+        }
 
         final GCResult gcResult = getResult(options, checkpoint, clock, RGC, 
scope);
         scope = gcResult.gcScope;
@@ -321,6 +329,32 @@ public class VersionGCRecommendations {
         }
     }
 
+    @Nullable
+    private Revision getLastAliveRevision(Clock clock, Checkpoints 
checkpoints) {
+        //Get uncached doc
+        SortedMap<Revision, Checkpoints.Info> checkpointsInfoMap = 
checkpoints.getCheckpoints();
+        if(checkpointsInfoMap.isEmpty()){
+            return null;
+        }
+
+        final long currentTime = clock.getTime();
+        Revision lastAliveRevision = null;
+
+        for (Map.Entry<Revision, Checkpoints.Info> e : 
checkpointsInfoMap.entrySet()) {
+            long expiryTime = e.getValue().getExpiryTime();
+            if (currentTime < expiryTime) {
+                Revision cpRev = e.getKey();
+                RevisionVector rv = e.getValue().getCheckpoint();
+                if (rv != null) {
+                    cpRev = rv.getRevision(cpRev.getClusterId());
+                }
+                lastAliveRevision = Utils.min(lastAliveRevision, cpRev);
+            }
+        }
+
+        return lastAliveRevision;
+    }
+
     private Map<String, Object> getVGCSettings() {
         Document versionGCDoc = 
vgc.getDocumentStore().find(Collection.SETTINGS, SETTINGS_COLLECTION_ID, 0);
         Map<String, Object> settings = new HashMap<>();

Reply via email to