Author: mreutegg
Date: Mon Sep 11 14:16:17 2017
New Revision: 1808028
URL: http://svn.apache.org/viewvc?rev=1808028&view=rev
Log:
OAK-6647: Reduce reads by RevisionGC
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java?rev=1808028&r1=1808027&r2=1808028&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java
Mon Sep 11 14:16:17 2017
@@ -1044,7 +1044,8 @@ public class VersionGarbageCollector {
long oldestPossible;
long collectLimit = options.collectLimit;
- lastOldestTimestamp =
getLongSetting(SETTINGS_COLLECTION_OLDEST_TIMESTAMP_PROP);
+ Map<String, Long> settings = getLongSettings();
+ lastOldestTimestamp =
settings.get(SETTINGS_COLLECTION_OLDEST_TIMESTAMP_PROP);
if (lastOldestTimestamp == 0) {
log.debug("No lastOldestTimestamp found, querying for the
oldest deletedOnce candidate");
oldestPossible =
versionStore.getOldestDeletedOnceTimestamp(nodeStore.getClock(),
options.precisionMs) - 1;
@@ -1056,7 +1057,7 @@ public class VersionGarbageCollector {
TimeInterval scope = new TimeInterval(oldestPossible,
Long.MAX_VALUE);
scope = scope.notLaterThan(keep.fromMs);
- suggestedIntervalMs =
getLongSetting(SETTINGS_COLLECTION_REC_INTERVAL_PROP);
+ suggestedIntervalMs =
settings.get(SETTINGS_COLLECTION_REC_INTERVAL_PROP);
if (suggestedIntervalMs > 0) {
suggestedIntervalMs = Math.max(suggestedIntervalMs,
options.precisionMs);
if (suggestedIntervalMs < scope.getDurationMs()) {
@@ -1154,20 +1155,25 @@ public class VersionGarbageCollector {
}
}
- private long getLongSetting(String propName) {
+ private Map<String, Long> getLongSettings() {
Document versionGCDoc = ds.find(Collection.SETTINGS,
SETTINGS_COLLECTION_ID, 0);
+ Map<String, Long> settings = Maps.newHashMap();
+ // default values
+ settings.put(SETTINGS_COLLECTION_OLDEST_TIMESTAMP_PROP, 0L);
+ settings.put(SETTINGS_COLLECTION_REC_INTERVAL_PROP, 0L);
if (versionGCDoc != null) {
- Long l = (Long) versionGCDoc.get(propName);
- if (l != null) {
- return l;
+ for (String k : versionGCDoc.keySet()) {
+ Object value = versionGCDoc.get(k);
+ if (value instanceof Number) {
+ settings.put(k, ((Number) value).longValue());
+ }
}
}
- return 0;
+ return settings;
}
private void setLongSetting(String propName, long val) {
- UpdateOp updateOp = new UpdateOp(SETTINGS_COLLECTION_ID,
- (ds.find(Collection.SETTINGS, SETTINGS_COLLECTION_ID) ==
null));
+ UpdateOp updateOp = new UpdateOp(SETTINGS_COLLECTION_ID, true);
updateOp.set(propName, val);
ds.createOrUpdate(Collection.SETTINGS, updateOp);
}
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCTest.java?rev=1808028&r1=1808027&r2=1808028&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCTest.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCTest.java
Mon Sep 11 14:16:17 2017
@@ -26,6 +26,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
import javax.annotation.Nonnull;
@@ -227,6 +228,14 @@ public class VersionGCTest {
assertTrue(infoMessages.get(2).startsWith("Revision garbage collection
finished"));
}
+ @Test
+ public void findVersionGC() throws Exception {
+ store.findVersionGC.set(0);
+ gc.gc(1, TimeUnit.HOURS);
+ // must only read once
+ assertEquals(1, store.findVersionGC.get());
+ }
+
private Future<VersionGCStats> gc() {
// run gc in a separate thread
return execService.submit(new Callable<VersionGCStats>() {
@@ -258,6 +267,8 @@ public class VersionGCTest {
Semaphore semaphore = new Semaphore(1);
+ AtomicLong findVersionGC = new AtomicLong();
+
@Nonnull
@Override
public <T extends Document> List<T> query(Collection<T> collection,
@@ -273,6 +284,16 @@ public class VersionGCTest {
semaphore.release();
}
}
+
+ @Override
+ public <T extends Document> T find(Collection<T> collection,
+ String key) {
+ if (collection == Collection.SETTINGS
+ && key.equals("versionGC")) {
+ findVersionGC.incrementAndGet();
+ }
+ return super.find(collection, key);
+ }
}
}