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 2017/06/27 11:04:41 UTC
svn commit: r1800049 -
/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java
Author: mduerig
Date: Tue Jun 27 11:04:40 2017
New Revision: 1800049
URL: http://svn.apache.org/viewvc?rev=1800049&view=rev
Log:
OAK-5790: Chronologically rebase checkpoints on top of each other during compaction
Unit tests
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java?rev=1800049&r1=1800048&r2=1800049&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java Tue Jun 27 11:04:40 2017
@@ -18,14 +18,36 @@
package org.apache.jackrabbit.oak.segment;
+import static com.google.common.collect.Lists.newArrayList;
+import static org.apache.jackrabbit.oak.plugins.memory.MultiBinaryPropertyState.binaryPropertyFromBlob;
+import static org.apache.jackrabbit.oak.segment.DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder;
import static org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
+import java.util.List;
+import java.util.Random;
+import javax.annotation.Nonnull;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import org.apache.jackrabbit.oak.api.Blob;
import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.segment.file.FileStore;
import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.junit.After;
+import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
@@ -34,14 +56,109 @@ public class OnlineCompactorTest {
@Rule
public TemporaryFolder folder = new TemporaryFolder(new File("target"));
- private File getFileStoreFolder() {
- return folder.getRoot();
+ private FileStore fileStore;
+
+ private SegmentNodeStore nodeStore;
+
+ @Before
+ public void setup() throws IOException, InvalidFileStoreVersionException {
+ fileStore = fileStoreBuilder(folder.getRoot()).build();
+ nodeStore = SegmentNodeStoreBuilders.builder(fileStore).build();
+ }
+
+ @After
+ public void tearDown() {
+ fileStore.close();
}
@Test
- public void bar() throws IOException, InvalidFileStoreVersionException, CommitFailedException {
- try (FileStore fileStore = fileStoreBuilder(getFileStoreFolder()).build()) {
+ public void testCompact() throws Exception {
+ OnlineCompactor compactor = createCompactor(fileStore, Suppliers.ofInstance(false));
+ addTestContent(nodeStore);
+
+ NodeState uncompacted = nodeStore.getRoot();
+ SegmentNodeState compacted = compactor.compact(uncompacted);
+ assertNotNull(compacted);
+ assertFalse(uncompacted == compacted);
+ assertEquals(uncompacted, compacted);
+ assertEquals(1, compacted.getSegment().getGcGeneration());
+
+ modifyTestContent(nodeStore);
+ NodeState modified = nodeStore.getRoot();
+ compacted = compactor.compact(uncompacted, modified, compacted);
+ assertNotNull(compacted);
+ assertFalse(modified == compacted);
+ assertEquals(modified, compacted);
+ assertEquals(1, compacted.getSegment().getGcGeneration());
+ }
+
+ @Test
+ public void testExceedUpdateLimit() throws Exception {
+ OnlineCompactor compactor = createCompactor(fileStore, Suppliers.ofInstance(false));
+ addNodes(nodeStore, OnlineCompactor.UPDATE_LIMIT * 2 + 1);
+
+ NodeState uncompacted = nodeStore.getRoot();
+ SegmentNodeState compacted = compactor.compact(uncompacted);
+ assertNotNull(compacted);
+ assertFalse(uncompacted == compacted);
+ assertEquals(uncompacted, compacted);
+ assertEquals(1, compacted.getSegment().getGcGeneration());
+ }
+
+ @Test
+ public void testCancel() throws IOException, CommitFailedException {
+ OnlineCompactor compactor = createCompactor(fileStore, Suppliers.ofInstance(true));
+ addTestContent(nodeStore);
+ NodeBuilder builder = nodeStore.getRoot().builder();
+ builder.setChildNode("cancel").setProperty("cancel", "cancel");
+ nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+ assertNull(compactor.compact(nodeStore.getRoot()));
+ }
+
+ @Nonnull
+ private static OnlineCompactor createCompactor(FileStore fileStore, Supplier<Boolean> cancel) {
+ SegmentWriter writer = defaultSegmentWriterBuilder("c").withGeneration(1).build(fileStore);
+ return new OnlineCompactor(fileStore.getReader(), writer, fileStore.getBlobStore(), cancel);
+ }
+
+ private static void addNodes(SegmentNodeStore nodeStore, int count)
+ throws CommitFailedException {
+ NodeBuilder builder = nodeStore.getRoot().builder();
+ for (int k = 0; k < count; k++) {
+ builder.setChildNode("n-" + k);
+ }
+ nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+ }
+
+ private static void addTestContent(NodeStore nodeStore) throws CommitFailedException, IOException {
+ NodeBuilder builder = nodeStore.getRoot().builder();
+ builder.setChildNode("a").setChildNode("aa").setProperty("p", 42);
+ builder.setChildNode("b").setProperty("bin", createBlob(nodeStore, 42));
+ builder.setChildNode("c").setProperty(binaryPropertyFromBlob("bins", createBlobs(nodeStore, 42, 43, 44)));
+ nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+ }
+
+ private static void modifyTestContent(NodeStore nodeStore) throws CommitFailedException {
+ NodeBuilder builder = nodeStore.getRoot().builder();
+ builder.getChildNode("a").getChildNode("aa").remove();
+ builder.getChildNode("b").setProperty("bin", "changed");
+ builder.getChildNode("c").removeProperty("bins");
+ nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+ }
+
+ private static Blob createBlob(NodeStore nodeStore, int size) throws IOException {
+ byte[] data = new byte[size];
+ new Random().nextBytes(data);
+ return nodeStore.createBlob(new ByteArrayInputStream(data));
+ }
+
+ private static List<Blob> createBlobs(NodeStore nodeStore, int... sizes) throws IOException {
+ List<Blob> blobs = newArrayList();
+ for (int size : sizes) {
+ blobs.add(createBlob(nodeStore, size));
}
+ return blobs;
}
}