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 ch...@apache.org on 2015/09/28 06:19:27 UTC

svn commit: r1705603 - /jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCDeletionTest.java

Author: chetanm
Date: Mon Sep 28 04:19:26 2015
New Revision: 1705603

URL: http://svn.apache.org/viewvc?rev=1705603&view=rev
Log:
OAK-2623 - Add test for GC of previous docs of a deleted document

Adding the testcase. Credits to Vikas Saurabh for the patch

Modified:
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCDeletionTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCDeletionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCDeletionTest.java?rev=1705603&r1=1705602&r2=1705603&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCDeletionTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGCDeletionTest.java Mon Sep 28 04:19:26 2015
@@ -30,6 +30,7 @@ import java.util.concurrent.TimeUnit;
 
 import javax.annotation.Nonnull;
 
+import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
@@ -205,6 +206,62 @@ public class VersionGCDeletionTest {
         assertEquals(noOfDocsToDelete * 2 + 1, stats.deletedDocGCCount);
     }
 
+    @Test
+    public void gcForPreviousDocs() throws Exception{
+        DocumentStore ts = new MemoryDocumentStore();
+        store = new DocumentMK.Builder()
+                .clock(clock)
+                .setDocumentStore(ts)
+                .setAsyncDelay(0)
+                .getNodeStore();
+
+        //Baseline the clock
+        clock.waitUntil(Revision.getCurrentTimestamp());
+
+        NodeBuilder b1;
+        NodeBuilder xb;
+
+        //Create/remove "/x/split" sufficient times to split it
+        boolean create = true;
+        for (int i = 0; create || i < NodeDocument.NUM_REVS_THRESHOLD ; i++) {
+            b1 = store.getRoot().builder();
+            xb = b1.child("x").child("split");
+            if (!create) {
+                xb.remove();
+            }
+            store.merge(b1, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+            create = !create;
+        }
+        store.runBackgroundOperations();
+
+        //Count split docs
+        NodeDocument doc = ts.find(Collection.NODES, "2:/x/split");
+        int splitDocCount = Iterators.size(doc.getAllPreviousDocs());
+
+        long maxAge = 1; //hours
+        long delta = TimeUnit.MINUTES.toMillis(10);
+
+        //Remove "/x"
+        NodeBuilder b2 = store.getRoot().builder();
+        b2.child("x").remove();
+        store.merge(b2, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+        store.runBackgroundOperations();
+
+        //Pass some time and run GC
+        clock.waitUntil(clock.getTime() + HOURS.toMillis(maxAge * 2) + delta);
+        VersionGarbageCollector gc = store.getVersionGarbageCollector();
+        VersionGCStats stats = gc.gc(maxAge * 2, HOURS);
+
+        //Asset GC stats
+        assertEquals(2, stats.deletedDocGCCount);
+        assertEquals(splitDocCount, stats.splitDocGCCount);
+
+        //check if the deleted docs are really gone after GC
+        assertNull(ts.find(Collection.NODES, "1:/x"));
+        assertNull(ts.find(Collection.NODES, "2:/x/split"));
+    }
+
     // OAK-2420
     @Test
     public void queryWhileDocsAreRemoved() throws Exception {