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();