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
}