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 md...@apache.org on 2015/08/06 15:57:20 UTC

svn commit: r1694497 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/backup/ main/java/org/apache/jackrabbit/oak/plugins/segment/ main/java/org/apache/jackrabbit/oak/plugins/segment/file/ test/java/org/apache/jackra...

Author: mduerig
Date: Thu Aug  6 13:57:20 2015
New Revision: 1694497

URL: http://svn.apache.org/r1694497
Log:
OAK-3177: Compaction slow on repository with continuous writes
Add onto state to compactor where the difference between the before and the after state would be applied to

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactorTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStoreTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java?rev=1694497&r1=1694496&r2=1694497&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java Thu Aug  6 13:57:20 2015
@@ -67,7 +67,7 @@ public class FileStoreRestore {
         long s = System.currentTimeMillis();
         NodeState current = store.getRoot();
         RestoreCompactor compactor = new RestoreCompactor(writer);
-        SegmentNodeBuilder builder = compactor.process(current, source);
+        SegmentNodeBuilder builder = compactor.process(current, source, current);
         store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
         log.debug("Restore finished in {} ms.", System.currentTimeMillis() - s);
     }
@@ -79,8 +79,8 @@ public class FileStoreRestore {
         }
 
         @Override
-        protected SegmentNodeBuilder process(NodeState before, NodeState after) {
-            return super.process(before, after);
+        protected SegmentNodeBuilder process(NodeState before, NodeState after, NodeState onto) {
+            return super.process(before, after, onto);
         }
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java?rev=1694497&r1=1694496&r2=1694497&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java Thu Aug  6 13:57:20 2015
@@ -94,15 +94,38 @@ public class Compactor {
         this.cloneBinaries = compactionStrategy.cloneBinaries();
     }
 
-    protected SegmentNodeBuilder process(NodeState before, NodeState after) {
-        SegmentNodeBuilder builder = new SegmentNodeBuilder(
-                writer.writeNode(before), writer);
+    protected SegmentNodeBuilder process(NodeState before, NodeState after, NodeState onto) {
+        SegmentNodeBuilder builder = new SegmentNodeBuilder(writer.writeNode(onto), writer);
         after.compareAgainstBaseState(before, new CompactDiff(builder));
         return builder;
     }
 
+    /**
+     * Compact the differences between a {@code before} and a {@code after}
+     * on top of the {@code before} state.
+     * <p>
+     * Equivalent to {@code compact(before, after, before)}
+     *
+     * @param before  the before state
+     * @param after   the after state
+     * @return  the compacted state
+     */
     public SegmentNodeState compact(NodeState before, NodeState after) {
-        SegmentNodeState compacted = process(before, after).getNodeState();
+        SegmentNodeState compacted = process(before, after, before).getNodeState();
+        writer.flush();
+        return compacted;
+    }
+
+    /**
+     * Compact the differences between a {@code before} and a {@code after}
+     * on top of an {@code onto} state.
+     * @param before  the before state
+     * @param after   the after state
+     * @param onto    the onto state
+     * @return  the compacted state
+     */
+    public SegmentNodeState compact(NodeState before, NodeState after, NodeState onto) {
+        SegmentNodeState compacted = process(before, after, onto).getNodeState();
         writer.flush();
         return compacted;
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java?rev=1694497&r1=1694496&r2=1694497&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java Thu Aug  6 13:57:20 2015
@@ -735,7 +735,7 @@ public class FileStore implements Segmen
                     existing);
         }
 
-        SegmentNodeState after = compactor.compact(EMPTY_NODE, before);
+        SegmentNodeState after = compactor.compact(EMPTY_NODE, before, EMPTY_NODE);
 
         Callable<Boolean> setHead = new SetHead(before, after, compactor);
         try {
@@ -749,7 +749,8 @@ public class FileStore implements Segmen
                 gcMonitor.info("TarMK compaction detected concurrent commits while compacting. " +
                         "Compacting these commits. Cycle {}", cycles);
                 SegmentNodeState head = getHead();
-                after = compactor.compact(after, head);
+                after = compactor.compact(before, head, after);
+                before = head;
                 setHead = new SetHead(head, after, compactor);
             }
             if (!success) {
@@ -757,7 +758,7 @@ public class FileStore implements Segmen
                         "{} cycles.", cycles - 1);
                 if (compactionStrategy.getForceAfterFail()) {
                     gcMonitor.info("TarMK compaction force compacting remaining commits");
-                    if (!forceCompact(after, compactor)) {
+                    if (!forceCompact(before, after, compactor)) {
                         gcMonitor.warn("TarMK compaction failed to force compact remaining commits. " +
                                 "Most likely compaction didn't get exclusive access to the store.");
                     }
@@ -771,11 +772,11 @@ public class FileStore implements Segmen
         }
     }
 
-    private boolean forceCompact(final SegmentNodeState before, final Compactor compactor) throws Exception {
+    private boolean forceCompact(final NodeState before, final SegmentNodeState onto, final Compactor compactor) throws Exception {
         return compactionStrategy.compacted(new Callable<Boolean>() {
             @Override
             public Boolean call() throws Exception {
-                return new SetHead(getHead(), compactor.compact(before, getHead()), compactor).call();
+                return new SetHead(getHead(), compactor.compact(before, getHead(), onto), compactor).call();
             }
         });
     }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactorTest.java?rev=1694497&r1=1694496&r2=1694497&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactorTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactorTest.java Thu Aug  6 13:57:20 2015
@@ -43,11 +43,11 @@ public class CompactorTest {
 
             NodeState initial = store.getRoot();
             SegmentNodeState after = compactor
-                    .compact(initial, store.getRoot());
+                    .compact(initial, store.getRoot(), initial);
             Assert.assertEquals(store.getRoot(), after);
 
             addTestContent(store, 1);
-            after = compactor.compact(initial, store.getRoot());
+            after = compactor.compact(initial, store.getRoot(), initial);
             Assert.assertEquals(store.getRoot(), after);
 
         } finally {

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStoreTest.java?rev=1694497&r1=1694496&r2=1694497&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStoreTest.java Thu Aug  6 13:57:20 2015
@@ -21,6 +21,7 @@ import static com.google.common.collect.
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
+import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
 import static org.apache.jackrabbit.oak.plugins.segment.SegmentVersion.V_11;
 
 import java.io.ByteArrayInputStream;
@@ -35,7 +36,6 @@ import java.util.Random;
 
 import com.google.common.base.Strings;
 import org.apache.jackrabbit.oak.api.Blob;
-import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
 import org.apache.jackrabbit.oak.plugins.segment.Compactor;
 import org.apache.jackrabbit.oak.plugins.segment.RecordId;
 import org.apache.jackrabbit.oak.plugins.segment.Segment;
@@ -114,7 +114,7 @@ public class FileStoreTest {
 
         Compactor compactor = new Compactor(writer);
         SegmentNodeState compacted =
-                compactor.compact(EmptyNodeState.EMPTY_NODE, head);
+                compactor.compact(EMPTY_NODE, head, EMPTY_NODE);
         store.close();
 
         // First simulate the case where during compaction a reference to the
@@ -142,7 +142,7 @@ public class FileStoreTest {
         assertTrue(store.size() > largeBinarySize);
         writer = new SegmentWriter(store, store.getTracker(), V_11);
         compactor = new Compactor(writer);
-        compacted = compactor.compact(EmptyNodeState.EMPTY_NODE, head);
+        compacted = compactor.compact(EMPTY_NODE, head, EMPTY_NODE);
         builder = head.builder();
         builder.setChildNode("old", head); // reference to pre-compacted state
         builder.getNodeState();