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;
     }
 
 }