Author: chetanm
Date: Fri Mar 28 09:45:54 2014
New Revision: 1582658

URL: http://svn.apache.org/r1582658
Log:
OAK-1341 - DocumentNodeStore: Implement revision garbage collection (WIP)

 Testing more code paths for deletion case

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollector.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/CloseableIterable.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorTest.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=1582658&r1=1582657&r2=1582658&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
 Fri Mar 28 09:45:54 2014
@@ -98,6 +98,10 @@ class VersionGarbageCollector {
         this.maxRevisionAge = maxRevisionAge;
     }
 
+    public long getMaxRevisionAge() {
+        return maxRevisionAge;
+    }
+
     public static class VersionGCStats {
         boolean ignoredGCDueToCheckPoint;
         int deletedDocCount;

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/CloseableIterable.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/CloseableIterable.java?rev=1582658&r1=1582657&r2=1582658&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/CloseableIterable.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/CloseableIterable.java
 Fri Mar 28 09:45:54 2014
@@ -31,6 +31,10 @@ public class CloseableIterable<T> implem
         return new CloseableIterable<T>(iterable, closeable);
     }
 
+    public static <T> CloseableIterable<T> wrap(Iterable<T> iterable){
+        return new CloseableIterable<T>(iterable, null);
+    }
+
     public CloseableIterable(Iterable<T> iterable, Closeable closeable) {
         this.iterable = iterable;
         this.closeable = closeable;
@@ -38,7 +42,9 @@ public class CloseableIterable<T> implem
 
     @Override
     public void close() throws IOException {
-        closeable.close();
+        if(closeable != null){
+            closeable.close();
+        }
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorTest.java?rev=1582658&r1=1582657&r2=1582658&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorTest.java
 Fri Mar 28 09:45:54 2014
@@ -22,6 +22,7 @@ package org.apache.jackrabbit.oak.plugin
 import java.io.IOException;
 import java.util.*;
 import java.util.Collection;
+import java.util.concurrent.TimeUnit;
 
 import static 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.VersionGCStats;
 import static org.junit.Assert.assertEquals;
@@ -72,6 +73,7 @@ public class VersionGarbageCollectorTest
         store = new DocumentMK.Builder()
                 .clock(clock)
                 .setDocumentStore(fixture.createDocumentStore())
+                .setAsyncDelay(0)
                 .getNodeStore();
         gc = store.getVersionGarbageCollector();
 
@@ -110,9 +112,9 @@ public class VersionGarbageCollectorTest
         b1.child("z");
         store.merge(b1, EmptyHook.INSTANCE, CommitInfo.EMPTY);
 
-        int maxAge = 10000, delta = maxAge;
+        long maxAge = TimeUnit.HOURS.toMillis(1), delta = 
TimeUnit.MINUTES.toMillis(10);
         gc.setMaxRevisionAge(maxAge);
-        //Go past GC age and check no GC done as nothing deleted
+        //1. Go past GC age and check no GC done as nothing deleted
         clock.waitUntil(Revision.getCurrentTimestamp() + maxAge);
         VersionGCStats stats = gc.gc();
         assertEquals(0, stats.deletedDocCount);
@@ -121,11 +123,36 @@ public class VersionGarbageCollectorTest
         NodeBuilder b2 = store.getRoot().builder();
         b2.child("x").child("y").remove();
         store.merge(b2, EmptyHook.INSTANCE, CommitInfo.EMPTY);
-        clock.waitUntil(Revision.getCurrentTimestamp() + maxAge + delta);
+
+        store.runBackgroundOperations();
+
+        //2. Check that a deleted doc is not collected before
+        //maxAge
+        //Clock cannot move back (it moved forward in #1) so double the maxAge
+        gc.setMaxRevisionAge(maxAge*2);
+        clock.waitUntil(clock.getTime() + delta);
+        stats = gc.gc();
+        assertEquals(0, stats.deletedDocCount);
+
+        //3. Check that deleted doc does get collected post maxAge
+        clock.waitUntil(clock.getTime() + gc.getMaxRevisionAge() + delta);
 
         stats = gc.gc();
         assertEquals(1, stats.deletedDocCount);
 
+        //4. Check that a revived doc (deleted and created again) does not get 
gc
+        NodeBuilder b3 = store.getRoot().builder();
+        b3.child("z").remove();
+        store.merge(b3, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+        NodeBuilder b4 = store.getRoot().builder();
+        b4.child("z");
+        store.merge(b4, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+        clock.waitUntil(clock.getTime() + gc.getMaxRevisionAge() + delta);
+        stats = gc.gc();
+        assertEquals(0, stats.deletedDocCount);
+
         //TODO Add test scenario for deletion along with previous docs
     }
 


Reply via email to