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);
+        }
     }
 
 }


Reply via email to