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 {