You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by mr...@apache.org on 2020/02/24 09:45:08 UTC

svn commit: r1874441 - in /jackrabbit/oak/trunk/oak-store-document/src: main/java/org/apache/jackrabbit/oak/plugins/document/ test/java/org/apache/jackrabbit/oak/plugins/document/

Author: mreutegg
Date: Mon Feb 24 09:45:08 2020
New Revision: 1874441

URL: http://svn.apache.org/viewvc?rev=1874441&view=rev
Log:
OAK-8914: Throttle Revision GC

Patch provided by Vinod Holani

Modified:
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Configuration.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceTest.java

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Configuration.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Configuration.java?rev=1874441&r1=1874440&r2=1874441&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Configuration.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Configuration.java Mon Feb 24 09:45:08 2020
@@ -184,6 +184,12 @@ import static org.apache.jackrabbit.oak.
     long versionGCTimeLimitInSecs() default DocumentNodeStoreService.DEFAULT_RGC_TIME_LIMIT_SECS;
 
     @AttributeDefinition(
+            name = "Delay factor for a Version GC run",
+            description = "A Version GC run has a gap of this delay factor to reduce continuous load on system" +
+                    "The default value is " + DocumentNodeStoreService.DEFAULT_RGC_DELAY_FACTOR)
+    double versionGCDelayFactor() default DocumentNodeStoreService.DEFAULT_RGC_DELAY_FACTOR;
+
+    @AttributeDefinition(
             name = "Blob GC Max Age (in secs)",
             description = "Blob Garbage Collector (GC) logic will only consider those blobs for GC which " +
                     "are not accessed recently (currentTime - lastModifiedTime > blobGcMaxAgeInSecs). For " +

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java?rev=1874441&r1=1874440&r2=1874441&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java Mon Feb 24 09:45:08 2020
@@ -138,6 +138,7 @@ public class DocumentNodeStoreService {
     public static final String CONTINUOUS_RGC_EXPR = "*/5 * * * * ?";
     public static final String CLASSIC_RGC_EXPR = "0 0 2 * * ?";
     public static final long DEFAULT_RGC_TIME_LIMIT_SECS = 3*60*60; // default is 3 hours
+    public static final double DEFAULT_RGC_DELAY_FACTOR = 0;
     private static final String DESCRIPTION = "oak.nodestore.description";
     static final long DEFAULT_JOURNAL_GC_INTERVAL_MILLIS = 5*60*1000; // default is 5min
     static final long DEFAULT_JOURNAL_GC_MAX_AGE_MILLIS = 24*60*60*1000; // default is 24hours
@@ -756,7 +757,7 @@ public class DocumentNodeStoreService {
                     BlobGCMBean.TYPE, "Document node store blob garbage collection"));
         }
 
-        Runnable startGC = new RevisionGCJob(store, versionGcMaxAgeInSecs, 0);
+        Runnable startGC = new RevisionGCJob(store, versionGcMaxAgeInSecs, 0, DEFAULT_RGC_DELAY_FACTOR);
         Runnable cancelGC = () -> store.getVersionGarbageCollector().cancel();
         Supplier<String> status = () -> store.getVersionGarbageCollector().getStatus();
         RevisionGC revisionGC = new RevisionGC(startGC, cancelGC, status, executor);
@@ -816,9 +817,10 @@ public class DocumentNodeStoreService {
         props.put("scheduler.expression", expr);
         long versionGcMaxAgeInSecs = config.versionGcMaxAgeInSecs();
         long versionGCTimeLimitInSecs = config.versionGCTimeLimitInSecs();
+        double versionGCDelayFactor = config.versionGCDelayFactor();
         addRegistration(scheduleWithFixedDelay(whiteboard,
                 new RevisionGCJob(nodeStore, versionGcMaxAgeInSecs,
-                        versionGCTimeLimitInSecs),
+                        versionGCTimeLimitInSecs, versionGCDelayFactor),
                 props, MODIFIED_IN_SECS_RESOLUTION, true, true));
     }
 
@@ -898,23 +900,26 @@ public class DocumentNodeStoreService {
         private final DocumentNodeStore nodeStore;
         private final long versionGCMaxAgeInSecs;
         private final long versionGCTimeLimitInSecs;
+        private final double versionGCDelayFactor;
         private volatile Object lastResult = "";
         private long lastLogTime;
         private VersionGCStats stats;
 
         RevisionGCJob(DocumentNodeStore ns,
                       long versionGcMaxAgeInSecs,
-                      long versionGCTimeLimitInSecs) {
+                      long versionGCTimeLimitInSecs,
+                      double versionGCDelayFactor) {
             this.nodeStore = ns;
             this.versionGCMaxAgeInSecs = versionGcMaxAgeInSecs;
             this.versionGCTimeLimitInSecs = versionGCTimeLimitInSecs;
+            this.versionGCDelayFactor = versionGCDelayFactor;
             resetStats();
         }
 
         @Override
         public void run() {
             VersionGarbageCollector gc = nodeStore.getVersionGarbageCollector();
-            gc.setOptions(gc.getOptions().withMaxDuration(TimeUnit.SECONDS, versionGCTimeLimitInSecs));
+            gc.setOptions(gc.getOptions().withMaxDuration(TimeUnit.SECONDS, versionGCTimeLimitInSecs).withDelayFactor(versionGCDelayFactor));
             try {
                 VersionGCStats s = gc.gc(versionGCMaxAgeInSecs, TimeUnit.SECONDS);
                 stats.addRun(s);

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceTest.java?rev=1874441&r1=1874440&r2=1874441&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceTest.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceTest.java Mon Feb 24 09:45:08 2020
@@ -259,6 +259,25 @@ public class DocumentNodeStoreServiceTes
         assertEquals(LeaseCheckMode.LENIENT, dns.getClusterInfo().getLeaseCheckMode());
     }
 
+    @Test
+    public void revisionGcDelayFactorCheckMode() {
+        Map<String, Object> config = newConfig(repoHome);
+        double delayFactor = 0.25;
+        config.put("versionGCDelayFactor", delayFactor);
+        MockOsgi.setConfigForPid(context.bundleContext(), PID, config);
+        MockOsgi.activate(service, context.bundleContext());
+        Runnable rgcJob = null;
+        for (Runnable r : context.getServices(Runnable.class, null)) {
+            if (r.getClass().equals(DocumentNodeStoreService.RevisionGCJob.class)) {
+                rgcJob = r;
+            }
+        }
+        assertNotNull(rgcJob);
+        rgcJob.run(); //Need to trigger run method explicitly as delay-factor is set in this method
+        DocumentNodeStore dns = context.getService(DocumentNodeStore.class);
+        assertEquals(delayFactor, dns.getVersionGarbageCollector().getOptions().delayFactor, 0.001);
+    }
+
     @NotNull
     private static MongoDocumentStore getMongoDocumentStore(DocumentNodeStore s) {
         try {