This is an automated email from the ASF dual-hosted git repository. daim pushed a commit to branch DetailedGC/OAK-10199 in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
commit bb2f543438fe1cb9d49db39986ac3037122519c7 Author: Rishabh Kumar <d...@adobe.com> AuthorDate: Tue May 30 19:38:02 2023 +0530 OAK-10199 : used bulk findAndModify api to perform garbage cleanup --- .../oak/plugins/document/Configuration.java | 8 ++++++++ .../plugins/document/DocumentNodeStoreBuilder.java | 21 +++++++++++++++++++++ .../plugins/document/DocumentNodeStoreService.java | 2 ++ .../plugins/document/VersionGarbageCollector.java | 5 +---- .../DocumentNodeStoreServiceConfigurationTest.java | 9 +++++++++ 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Configuration.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Configuration.java index ae7aa143d2..52bf2ecc30 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Configuration.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Configuration.java @@ -290,4 +290,12 @@ import static org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreServic "a change that is not yet visible. Default: " + DEFAULT_SUSPEND_TIMEOUT + " (milliseconds).") long suspendTimeoutMillis() default DEFAULT_SUSPEND_TIMEOUT; + + @AttributeDefinition( + name = "Document Node Store Detailed GC", + description = "Boolean value indicating whether Detailed GC should be enabled for " + + "document node store or not. The Default value is " + DEFAULT_DETAILED_GC_ENABLED + + ". Note that this value can be overridden via framework " + + "property 'oak.documentstore.detailedGCEnabled'") + boolean detailedGCEnabled() default DEFAULT_DETAILED_GC_ENABLED; } diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBuilder.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBuilder.java index aa3ab1ea81..d894aa27e4 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBuilder.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreBuilder.java @@ -164,6 +164,7 @@ public class DocumentNodeStoreBuilder<T extends DocumentNodeStoreBuilder<T>> { private Predicate<Path> nodeCachePredicate = Predicates.alwaysTrue(); private boolean clusterInvisible; private boolean throttlingEnabled; + private boolean detailedGCEnabled; private long suspendTimeoutMillis = DEFAULT_SUSPEND_TIMEOUT; /** @@ -287,6 +288,16 @@ public class DocumentNodeStoreBuilder<T extends DocumentNodeStoreBuilder<T>> { return this.throttlingEnabled; } + public T setDetailedGCEnabled(boolean b) { + this.detailedGCEnabled = b; + return thisBuilder(); + } + + public boolean isDetailedGCEnabled() { + return this.detailedGCEnabled; + } + + public T setReadOnlyMode() { this.isReadOnlyMode = true; return thisBuilder(); @@ -316,6 +327,16 @@ public class DocumentNodeStoreBuilder<T extends DocumentNodeStoreBuilder<T>> { return docStoreThrottlingFeature; } + public T setDocStoreDetailedGCFeature(@Nullable Feature docStoreDetailedGC) { + this.docStoreDetailedGCFeature = docStoreDetailedGC; + return thisBuilder(); + } + + @Nullable + public Feature getDocStoreDetailedGCFeature() { + return docStoreDetailedGCFeature; + } + public T setLeaseFailureHandler(LeaseFailureHandler leaseFailureHandler) { this.leaseFailureHandler = leaseFailureHandler; return thisBuilder(); diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java index ad01cda3ca..16229db0e1 100644 --- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java +++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java @@ -473,7 +473,9 @@ public class DocumentNodeStoreService { setLeaseCheckMode(ClusterNodeInfo.DEFAULT_LEASE_CHECK_DISABLED ? LeaseCheckMode.DISABLED : LeaseCheckMode.valueOf(config.leaseCheckMode())). setPrefetchFeature(prefetchFeature). setDocStoreThrottlingFeature(docStoreThrottlingFeature). + setDocStoreDetailedGCFeature(docStoreDetailedGCFeature). setThrottlingEnabled(config.throttlingEnabled()). + setDetailedGCEnabled(config.detailedGCEnabled()). setSuspendTimeoutMillis(config.suspendTimeoutMillis()). setLeaseFailureHandler(new LeaseFailureHandler() { 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 27ee36204a..3f9cb23f9a 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 @@ -635,8 +635,6 @@ public class VersionGarbageCollector { phases.stop(GCPhase.COLLECTING); } - // TODO : remove this code, I don't think its possible to fetch these documents - // who doesn't have _modified field final Long modified = doc.getModified(); if (modified == null) { monitor.warn("collectDetailGarbage : document has no _modified property : {}", @@ -874,8 +872,7 @@ public class VersionGarbageCollector { timer.reset().start(); try { - // TODO create an api to bulk update findAndUpdate Ops - updatedDocs = (int) updateOpList.stream().map(op -> ds.findAndUpdate(NODES, op)).filter(Objects::nonNull).count(); + updatedDocs = (int) ds.findAndUpdate(NODES, updateOpList).stream().filter(Objects::nonNull).count(); stats.updatedDetailedGCDocsCount += updatedDocs; log.info("Updated [{}] documents", updatedDocs); // now reset delete metadata diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceConfigurationTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceConfigurationTest.java index 88d9d27553..b3d5d69fb3 100644 --- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceConfigurationTest.java +++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceConfigurationTest.java @@ -85,6 +85,7 @@ public class DocumentNodeStoreServiceConfigurationTest { assertEquals(Arrays.asList("/"), Arrays.asList(config.persistentCacheIncludes())); assertEquals("STRICT", config.leaseCheckMode()); assertEquals(DEFAULT_THROTTLING_ENABLED, config.throttlingEnabled()); + assertEquals(DEFAULT_DETAILED_GC_ENABLED, config.detailedGCEnabled()); assertEquals(CommitQueue.DEFAULT_SUSPEND_TIMEOUT, config.suspendTimeoutMillis()); } @@ -104,6 +105,14 @@ public class DocumentNodeStoreServiceConfigurationTest { assertEquals(throttleDocStore, config.throttlingEnabled()); } + @Test + public void detailedGCEnabled() throws Exception { + boolean detailedGCDocStore = true; + addConfigurationEntry(preset, "detailedGCEnabled", detailedGCDocStore); + Configuration config = createConfiguration(); + assertEquals(detailedGCDocStore, config.detailedGCEnabled()); + } + @Test public void presetSocketKeepAlive() throws Exception { boolean keepAlive = !DocumentNodeStoreService.DEFAULT_SO_KEEP_ALIVE;