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 2014/10/15 18:03:22 UTC

svn commit: r1632104 - /jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/file/CompactionAndCleanupTest.java

Author: mduerig
Date: Wed Oct 15 16:03:22 2014
New Revision: 1632104

URL: http://svn.apache.org/r1632104
Log:
OAK-2192: Concurrent commit during compaction results in mixed segments
@Ignored test case

Modified:
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/file/CompactionAndCleanupTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/file/CompactionAndCleanupTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/file/CompactionAndCleanupTest.java?rev=1632104&r1=1632103&r2=1632104&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/file/CompactionAndCleanupTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/file/CompactionAndCleanupTest.java Wed Oct 15 16:03:22 2014
@@ -19,20 +19,31 @@
 
 package org.apache.jackrabbit.oak.plugins.segment.file;
 
+import static com.google.common.collect.Lists.newArrayList;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Random;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.oak.api.Blob;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.segment.Compactor;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentId;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
@@ -180,4 +191,83 @@ public class CompactionAndCleanupTest {
         }
     }
 
+    @Ignore("OAK-2192")  // FIXME OAK-2192
+    @Test
+    public void testMixedSegments() throws Exception {
+        FileStore store = new FileStore(directory, 2, false);
+        final SegmentNodeStore nodeStore = new SegmentNodeStore(store);
+
+        NodeBuilder root = nodeStore.getRoot().builder();
+        createNodes(root.setChildNode("test"), 10, 3);
+        nodeStore.merge(root, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+        final Set<UUID> beforeSegments = new HashSet<UUID>();
+        collectSegments(store.getHead(), beforeSegments);
+
+        final AtomicReference<Boolean> run = new AtomicReference<Boolean>(true);
+        final List<Integer> failedCommits = newArrayList();
+        Thread t = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                for (int k = 0; run.get(); k++) {
+                    try {
+                        NodeBuilder root = nodeStore.getRoot().builder();
+                        root.setChildNode("b" + k);
+                        nodeStore.merge(root, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+                        Thread.sleep(5);
+                    } catch (CommitFailedException e) {
+                        failedCommits.add(k);
+                    } catch (InterruptedException e) {
+                        Thread.interrupted();
+                        break;
+                    }
+                }
+            }
+        });
+        t.start();
+
+        store.compact();
+        run.set(false);
+        t.join();
+
+        assertTrue(failedCommits.isEmpty());
+
+        Set<UUID> afterSegments = new HashSet<UUID>();
+        collectSegments(store.getHead(), afterSegments);
+        try {
+            for (UUID u : beforeSegments) {
+                assertFalse("Mixed segments found: " + u, afterSegments.contains(u));
+            }
+        } finally {
+            store.close();
+        }
+    }
+
+    private static void collectSegments(SegmentNodeState s, Set<UUID> segmentIds) {
+        SegmentId sid = s.getRecordId().getSegmentId();
+        UUID id = new UUID(sid.getMostSignificantBits(),
+                sid.getLeastSignificantBits());
+        segmentIds.add(id);
+        for (ChildNodeEntry cne : s.getChildNodeEntries()) {
+            collectSegments((SegmentNodeState) cne.getNodeState(), segmentIds);
+        }
+    }
+
+    private static void createNodes(NodeBuilder builder, int count, int depth) {
+        if (depth > 0) {
+            for (int k = 0; k < count; k++) {
+                NodeBuilder child = builder.setChildNode("node" + k);
+                createProperties(child, count);
+                createNodes(child, count, depth - 1);
+            }
+        }
+    }
+
+    private static void createProperties(NodeBuilder builder, int count) {
+        for (int k = 0; k < count; k++) {
+            builder.setProperty("property-" + UUID.randomUUID().toString(), "value-" + UUID.randomUUID().toString());
+        }
+    }
+
+
 }