From 80faf086694e4ef67efdaa6a0bf53f1f3da2ef0b Mon Sep 17 00:00:00 2001 From: Julian Reschke Date: Thu, 26 Mar 2026 12:09:58 +0100 Subject: [PATCH 1/4] OAK-12166: RDBVersionGC MODE 1 (old method) should leverage SD columns when available - testing in 1.22 branch --- .../document/rdb/RDBVersionGCSupport.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java index 783afbab0b3..18f9f645987 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java @@ -95,10 +95,21 @@ protected Iterable identifyGarbage(final Set gcTypes } } - private Iterable getSplitDocuments() { - List conditions = Collections.emptyList(); - // absent support for SDTYPE as indexed property: exclude those - // documents from the query which definitively aren't split documents + // MODE==1 + private Iterable getSplitDocuments(final Set gcTypes, final RevisionVector sweepRevs, + final long oldestRevTimeStamp) { + List conditions = new ArrayList<>(); + if (store.getTable(Collection.NODES).hasSplitDocs()) { + // we can add constraints on SDTYPE + List gcTypeCodes = new ArrayList<>(); + for (SplitDocType type : gcTypes) { + gcTypeCodes.add(type.typeCode()); + } + conditions.add(new QueryCondition(NodeDocument.SD_TYPE, "in", gcTypeCodes)); + conditions.add(new QueryCondition(NodeDocument.SD_MAX_REV_TIME_IN_SECS, "<=", NodeDocument.getModifiedInSecs(oldestRevTimeStamp))); + conditions.add(new QueryCondition(RDBDocumentStore.VERSIONPROP, ">=", 2)); + } + // in any case: exclude those documents from the query which definitively aren't split documents List excludeKeyPatterns = Arrays.asList("_:/%", "__:/%", "___:/%"); return getIterator(excludeKeyPatterns, conditions); } From e96e7c351864b2b7e60d64ae5aa654a429a8c766 Mon Sep 17 00:00:00 2001 From: Julian Reschke Date: Thu, 26 Mar 2026 12:12:09 +0100 Subject: [PATCH 2/4] OAK-12166: RDBVersionGC MODE 1 (old method) should leverage SD columns when available - testing in 1.22 branch (make it compile) --- .../oak/plugins/document/rdb/RDBVersionGCSupport.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java index 18f9f645987..fe1d9a53e5c 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java @@ -116,7 +116,7 @@ private Iterable getSplitDocuments(final Set gcTypes private Iterable identifyGarbageMode1(final Set gcTypes, final RevisionVector sweepRevs, final long oldestRevTimeStamp) { - return filter(getSplitDocuments(), getGarbageCheckPredicate(gcTypes, sweepRevs, oldestRevTimeStamp)); + return filter(getSplitDocuments(gcTypes, sweepRevs, oldestRevTimeStamp), getGarbageCheckPredicate(gcTypes, sweepRevs, oldestRevTimeStamp)); } private Predicate getGarbageCheckPredicate(final Set gcTypes, final RevisionVector sweepRevs, From 674551cc4469ac2288d7e0041ed03a1cf1e30efb Mon Sep 17 00:00:00 2001 From: Julian Reschke Date: Sat, 28 Mar 2026 17:04:35 +0100 Subject: [PATCH 3/4] OAK-12166: RDBVersionGC MODE 1 (old method) should leverage SD columns when available - testing in 1.22 branch (remove unused parameter) --- .../oak/plugins/document/rdb/RDBVersionGCSupport.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java index fe1d9a53e5c..071a0eea0a3 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java @@ -96,8 +96,7 @@ protected Iterable identifyGarbage(final Set gcTypes } // MODE==1 - private Iterable getSplitDocuments(final Set gcTypes, final RevisionVector sweepRevs, - final long oldestRevTimeStamp) { + private Iterable getSplitDocuments(final Set gcTypes, final long oldestRevTimeStamp) { List conditions = new ArrayList<>(); if (store.getTable(Collection.NODES).hasSplitDocs()) { // we can add constraints on SDTYPE From 8acaebbf742630fa5254f5777894b578fda9191f Mon Sep 17 00:00:00 2001 From: Julian Reschke Date: Sat, 28 Mar 2026 17:13:09 +0100 Subject: [PATCH 4/4] OAK-12166: RDBVersionGC MODE 1 (old method) should leverage SD columns when available - testing in 1.22 branch (remove unused parameter) --- .../oak/plugins/document/rdb/RDBVersionGCSupport.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java index 071a0eea0a3..b7d6fdf365f 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java @@ -115,7 +115,7 @@ private Iterable getSplitDocuments(final Set gcTypes private Iterable identifyGarbageMode1(final Set gcTypes, final RevisionVector sweepRevs, final long oldestRevTimeStamp) { - return filter(getSplitDocuments(gcTypes, sweepRevs, oldestRevTimeStamp), getGarbageCheckPredicate(gcTypes, sweepRevs, oldestRevTimeStamp)); + return filter(getSplitDocuments(gcTypes, oldestRevTimeStamp), getGarbageCheckPredicate(gcTypes, sweepRevs, oldestRevTimeStamp)); } private Predicate getGarbageCheckPredicate(final Set gcTypes, final RevisionVector sweepRevs,