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 mr...@apache.org on 2017/02/14 14:16:30 UTC

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

Author: mreutegg
Date: Tue Feb 14 14:16:30 2017
New Revision: 1782967

URL: http://svn.apache.org/viewvc?rev=1782967&view=rev
Log:
OAK-5605: Speed up time to cancel revision GC

Add ignored tests

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

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java?rev=1782967&r1=1782966&r2=1782967&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java Tue Feb 14 14:16:30 2017
@@ -20,6 +20,7 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.io.IOException;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -29,6 +30,7 @@ import java.util.concurrent.ExecutorServ
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
 
 import static com.google.common.collect.Iterables.filter;
 import static com.google.common.collect.Iterables.size;
@@ -55,11 +57,13 @@ import static org.junit.Assume.assumeTru
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.base.Strings;
+import com.google.common.collect.AbstractIterator;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Queues;
 import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.Atomics;
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.commons.PathUtils;
@@ -71,6 +75,7 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.stats.Clock;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -600,6 +605,92 @@ public class VersionGarbageCollectorIT {
         assertNotEquals(modCount, foo.getModCount());
     }
 
+    @Ignore("OAK-5605")
+    @Test
+    public void cancelGCBeforeFirstPhase() throws Exception {
+        createTestNode("foo");
+
+        NodeBuilder builder = store.getRoot().builder();
+        builder.child("foo").child("bar");
+        merge(store, builder);
+
+        builder = store.getRoot().builder();
+        builder.child("foo").remove();
+        merge(store, builder);
+        store.runBackgroundOperations();
+
+        clock.waitUntil(clock.getTime() + TimeUnit.HOURS.toMillis(1));
+
+        final AtomicReference<VersionGarbageCollector> gcRef = Atomics.newReference();
+        VersionGCSupport gcSupport = new VersionGCSupport(store.getDocumentStore()) {
+            @Override
+            public Iterable<NodeDocument> getPossiblyDeletedDocs(long lastModifiedTime) {
+                // cancel as soon as it runs
+                gcRef.get().cancel();
+                return super.getPossiblyDeletedDocs(lastModifiedTime);
+            }
+        };
+        gcRef.set(new VersionGarbageCollector(store, gcSupport));
+        VersionGCStats stats = gcRef.get().gc(30, TimeUnit.MINUTES);
+        assertTrue(stats.canceled);
+        assertEquals(0, stats.deletedDocGCCount);
+        assertEquals(0, stats.deletedLeafDocGCCount);
+        assertEquals(0, stats.intermediateSplitDocGCCount);
+        assertEquals(0, stats.splitDocGCCount);
+    }
+
+    @Ignore("OAK-5605")
+    @Test
+    public void cancelGCAfterFirstPhase() throws Exception {
+        createTestNode("foo");
+
+        NodeBuilder builder = store.getRoot().builder();
+        builder.child("foo").child("bar");
+        merge(store, builder);
+
+        builder = store.getRoot().builder();
+        builder.child("foo").remove();
+        merge(store, builder);
+        store.runBackgroundOperations();
+
+        clock.waitUntil(clock.getTime() + TimeUnit.HOURS.toMillis(1));
+
+        final AtomicReference<VersionGarbageCollector> gcRef = Atomics.newReference();
+        VersionGCSupport gcSupport = new VersionGCSupport(store.getDocumentStore()) {
+            @Override
+            public Iterable<NodeDocument> getPossiblyDeletedDocs(final long lastModifiedTime) {
+                return new Iterable<NodeDocument>() {
+                    @Override
+                    public Iterator<NodeDocument> iterator() {
+                        return new AbstractIterator<NodeDocument>() {
+                            private Iterator<NodeDocument> it = candidates(lastModifiedTime);
+                            @Override
+                            protected NodeDocument computeNext() {
+                                if (it.hasNext()) {
+                                    return it.next();
+                                }
+                                // cancel when we reach the end
+                                gcRef.get().cancel();
+                                return endOfData();
+                            }
+                        };
+                    }
+                };
+            }
+
+            private Iterator<NodeDocument> candidates(long lastModifiedTime) {
+                return super.getPossiblyDeletedDocs(lastModifiedTime).iterator();
+            }
+        };
+        gcRef.set(new VersionGarbageCollector(store, gcSupport));
+        VersionGCStats stats = gcRef.get().gc(30, TimeUnit.MINUTES);
+        assertTrue(stats.canceled);
+        assertEquals(0, stats.deletedDocGCCount);
+        assertEquals(0, stats.deletedLeafDocGCCount);
+        assertEquals(0, stats.intermediateSplitDocGCCount);
+        assertEquals(0, stats.splitDocGCCount);
+    }
+
     private void createTestNode(String name) throws CommitFailedException {
         DocumentStore ds = store.getDocumentStore();
         NodeBuilder builder = store.getRoot().builder();