Author: mreutegg
Date: Tue Oct  7 15:36:45 2014
New Revision: 1629917

URL: http://svn.apache.org/r1629917
Log:
OAK-2144: Intermittent Node not found at given revision with DocumentNodeStore

Add a simplified test with just two cluster nodes

Modified:
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterRevisionComparisonTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterRevisionComparisonTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterRevisionComparisonTest.java?rev=1629917&r1=1629916&r2=1629917&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterRevisionComparisonTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterRevisionComparisonTest.java
 Tue Oct  7 15:36:45 2014
@@ -19,7 +19,11 @@
 
 package org.apache.jackrabbit.oak.plugins.document;
 
+import java.util.List;
+
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore;
@@ -41,6 +45,7 @@ public class ClusterRevisionComparisonTe
     private MemoryDocumentStore ds = new MemoryDocumentStore();
     private MemoryBlobStore bs = new MemoryBlobStore();
     private Clock clock = new Clock.Virtual();
+    private List<DocumentNodeStore> stores = Lists.newArrayList();
 
     @Before
     public void setUp(){
@@ -104,19 +109,66 @@ public class ClusterRevisionComparisonTe
         c1ns1.compareAgainstBaseState(c1ns2, new ClusterTest.TrackingDiff());
     }
 
+    @Ignore("OAK-2144")
+    @Test
+    public void revisionComparisonTwoClusterNodes() throws Exception {
+        DocumentNodeStore c1 = createNS(1);
+        DocumentNodeStore c2 = createNS(2);
+
+        // 1. Create /a and make it visible to both cluster nodes
+        createNode(c1, "/a");
+        runBgOps(c1, c2);
+
+        // 2. Time T1. Create /a/c2 but do not push the changes yet rT1-C2
+        createNode(c2, "/a/c2");
+
+        // 3. Time T2. Create /a/c1
+        createNode(c1, "/a/c1");
+
+        // 4. Push changes on c2
+        runBgOps(c2);
+
+        // 5. Time T3. Read the changes /a/c2 by c2 created at T1.
+        // Now from C1 view rT1-C2 > rT2-C1 even though T1 < T2
+        runBgOps(c1);
+
+        DocumentNodeState c1ns1 = c1.getRoot();
+        NodeState a = c1ns1.getChildNode("a");
+        assertTrue("/a/c1 missing", a.hasChildNode("c1"));
+        assertTrue("/a/c2 missing", a.hasChildNode("c2"));
+
+        // 6. Purge revision comparator. Also purge entries from nodeCache
+        // such that later reads at rT1-C2 triggers read from underlying 
DocumentStore
+        c1.invalidateNodeCache("/a/c1" , 
((DocumentNodeState)c1ns1.getChildNode("a")).getLastRevision());
+        c1.invalidateNodeCache("/a/c2" , 
((DocumentNodeState)c1ns1.getChildNode("a")).getLastRevision());
+
+        //Revision comparator purge by moving in future
+        clock.waitUntil(clock.getTime() + 
DocumentNodeStore.REMEMBER_REVISION_ORDER_MILLIS * 2);
+        runBgOps(c1);
+
+        assertTrue("/a/c1 disappeared", a.hasChildNode("c1"));
+        assertTrue("/a/c2 disappeared", a.hasChildNode("c2"));
+    }
+
     @After
     public void tearDown(){
+        for (DocumentNodeStore store : stores) {
+            store.dispose();
+        }
+        stores.clear();
         Revision.resetClockToDefault();
     }
 
     private DocumentNodeStore createNS(int clusterId){
-        return new DocumentMK.Builder()
+        DocumentNodeStore store = new DocumentMK.Builder()
                 .setDocumentStore(ds)
                 .setBlobStore(bs)
                 .setClusterId(clusterId)
                 .setAsyncDelay(0)
                 .open()
                 .getNodeStore();
+        stores.add(store);
+        return store;
     }
 
    private NodeState createNode(NodeStore ns, String path) throws 
CommitFailedException {


Reply via email to