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 re...@apache.org on 2015/12/17 10:52:41 UTC

svn commit: r1720500 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/ test/java/org/apache/jackrabbit/oak/plugins/document/ test/java/org/apache/jackrabbit/oak/plugins/document/impl/ test/java/org/apache/ja...

Author: reschke
Date: Thu Dec 17 09:52:40 2015
New Revision: 1720500

URL: http://svn.apache.org/viewvc?rev=1720500&view=rev
Log:
OAK-3424: change ClusterNodeInfo to potentially wait for an abandoned cluster id to become available 


Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ClusterNodeInfo.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterConflictTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterJoinTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentConflictTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/impl/DocumentMKConcurrentAddTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/CollisionMarkerTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ClusterNodeInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ClusterNodeInfo.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ClusterNodeInfo.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ClusterNodeInfo.java Thu Dec 17 09:52:40 2015
@@ -374,7 +374,7 @@ public class ClusterNodeInfo {
 
         int retries = 10;
         for (int i = 0; i < retries; i++) {
-            ClusterNodeInfo clusterNode = createInstance(store, machineId, instanceId, configuredClusterId);
+            ClusterNodeInfo clusterNode = createInstance(store, machineId, instanceId, configuredClusterId, i == 0);
             String key = String.valueOf(clusterNode.id);
             UpdateOp update = new UpdateOp(key, true);
             update.set(ID, key);
@@ -409,7 +409,7 @@ public class ClusterNodeInfo {
     }
 
     private static ClusterNodeInfo createInstance(DocumentStore store, String machineId,
-            String instanceId, int configuredClusterId) {
+            String instanceId, int configuredClusterId, boolean waitForLease) {
 
         long now = getCurrentTime();
         int clusterNodeId = 0;
@@ -447,16 +447,25 @@ public class ClusterNodeInfo {
             }
 
             Long leaseEnd = (Long) doc.get(LEASE_END_KEY);
+            String mId = "" + doc.get(MACHINE_ID_KEY);
+            String iId = "" + doc.get(INSTANCE_ID_KEY);
 
             if (leaseEnd != null && leaseEnd > now) {
-                // TODO wait for lease end, see OAK-3449
+                // wait if (a) instructed to, and (b) also the remaining time
+                // time is not much bigger than the lease interval (in which
+                // case something is very very wrong anyway)
+                if (waitForLease && (leaseEnd - now) < (DEFAULT_LEASE_DURATION_MILLIS + 5000) && mId.equals(machineId)
+                        && iId.equals(instanceId)) {
+                    boolean worthRetrying = waitForLeaseExpiry(store, doc, leaseEnd.longValue(), machineId, instanceId);
+                    if (worthRetrying) {
+                        return createInstance(store, machineId, instanceId, configuredClusterId, false);
+                    }
+                }
+
                 reuseFailureReason = "leaseEnd " + leaseEnd + " > " + now + " - " + (leaseEnd - now) + "ms in the future";
                 continue;
             }
 
-            String mId = "" + doc.get(MACHINE_ID_KEY);
-            String iId = "" + doc.get(INSTANCE_ID_KEY);
-
             // remove entries with "random:" keys if not in use (no lease at all) 
             if (mId.startsWith(RANDOM_PREFIX) && leaseEnd == null) {
                 store.remove(Collection.CLUSTER_NODES, key);
@@ -506,6 +515,51 @@ public class ClusterNodeInfo {
                 RecoverLockState.NONE, prevLeaseEnd, newEntry);
     }
 
+    private static boolean waitForLeaseExpiry(DocumentStore store, ClusterNodeInfoDocument cdoc, long leaseEnd, String machineId,
+            String instanceId) {
+        String key = cdoc.getId();
+        LOG.info("Found an existing possibly active cluster node info (" + key + ") for this instance: " + machineId + "/"
+                + instanceId + ", will try use it.");
+
+        // wait until lease expiry plus 2s
+        long waitUntil = leaseEnd + 2000;
+
+        while (getCurrentTime() < waitUntil) {
+            LOG.info("Waiting for cluster node " + key + "'s lease to expire: " + (waitUntil - getCurrentTime()) / 1000 + "s left");
+
+            try {
+                Thread.sleep(5000);
+            } catch (InterruptedException e) {
+                // ignored
+            }
+
+            try {
+                // check state of cluster node info
+                ClusterNodeInfoDocument reread = store.find(Collection.CLUSTER_NODES, key);
+                if (reread == null) {
+                    LOG.info("Cluster node info " + key + ": gone; continueing.");
+                    return true;
+                } else {
+                    Long newLeaseEnd = (Long) reread.get(LEASE_END_KEY);
+                    if (newLeaseEnd == null) {
+                        LOG.info("Cluster node " + key + ": lease end information missing, aborting.");
+                        return false;
+                    } else {
+                        if (newLeaseEnd.longValue() != leaseEnd) {
+                            LOG.info("Cluster node " + key + " seems to be still active (lease end changed from " + leaseEnd
+                                    + " to " + newLeaseEnd + ", will not try to use it.");
+                            return false;
+                        }
+                    }
+                }
+            } catch (DocumentStoreException ex) {
+                LOG.info("Error reading cluster node info for key " + key, ex);
+                return false;
+            }
+        }
+        return true;
+    }
+
     public void performLeaseCheck() {
         if (leaseCheckDisabled || !renewed) {
             // if leaseCheckDisabled is set we never do the check, so return fast

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterConflictTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterConflictTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterConflictTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterConflictTest.java Thu Dec 17 09:52:40 2015
@@ -57,17 +57,18 @@ public class ClusterConflictTest {
     @Before
     public void setUp() {
         MemoryDocumentStore store = new MemoryDocumentStore();
-        ns1 = newDocumentNodeStore(store);
-        ns2 = newDocumentNodeStore(store);
+        ns1 = newDocumentNodeStore(store, 1);
+        ns2 = newDocumentNodeStore(store, 2);
     }
 
-    private DocumentNodeStore newDocumentNodeStore(DocumentStore store) {
+    private DocumentNodeStore newDocumentNodeStore(DocumentStore store, int clusterId) {
         // use high async delay and run background ops manually
         // asyncDelay set to zero prevents commits from suspending
         return builderProvider.newBuilder()
                 .setAsyncDelay(60000)
                 .setDocumentStore(store)
                 .setLeaseCheck(false) // disabled for debugging purposes
+                .setClusterId(clusterId)
                 .getNodeStore();
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java Thu Dec 17 09:52:40 2015
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertTru
 
 import java.util.List;
 
+import org.apache.jackrabbit.oak.plugins.document.ClusterNodeInfo.ClusterNodeState;
 import org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore;
 import org.apache.jackrabbit.oak.stats.Clock;
 import org.junit.After;
@@ -50,11 +51,13 @@ public class ClusterInfoTest {
                 setDocumentStore(mem).
                 setAsyncDelay(0).
                 setLeaseCheck(false).
+                setClusterId(1).
                 getNodeStore();
         DocumentNodeStore ns2 = new DocumentMK.Builder().
                 setDocumentStore(mem).
                 setAsyncDelay(0).
                 setLeaseCheck(false).
+                setClusterId(2).
                 getNodeStore();
         // Bring the current time forward to after the leaseTime which would have been 
         // updated in the DocumentNodeStore initialization.
@@ -140,6 +143,44 @@ public class ClusterInfoTest {
         return doc.getLeaseEndTime();
     }
 
+    @Test
+    public void useAbandoned() throws InterruptedException {
+
+        MemoryDocumentStore mem = new MemoryDocumentStore();
+
+        DocumentNodeStore ns1 = new DocumentMK.Builder().
+                setDocumentStore(mem).
+                setAsyncDelay(0).
+                setLeaseCheck(false).
+                getNodeStore();
+
+        DocumentStore ds = ns1.getDocumentStore();
+        int cid = ns1.getClusterId();
+
+        ClusterNodeInfoDocument cnid = ds.find(Collection.CLUSTER_NODES, "" + cid);
+        assertNotNull(cnid);
+        assertEquals(ClusterNodeState.ACTIVE.toString(), cnid.get(ClusterNodeInfo.STATE));
+        ns1.dispose();
+
+        long waitFor = 2000;
+        // modify record to indicate "active" with a lease end in the future
+        UpdateOp up = new UpdateOp("" + cid, false);
+        up.set(Document.ID, "" + cid);
+        up.set(ClusterNodeInfo.STATE, ClusterNodeState.ACTIVE.toString());
+        long now = System.currentTimeMillis();
+        up.set(ClusterNodeInfo.LEASE_END_KEY, now + waitFor);
+        ds.findAndUpdate(Collection.CLUSTER_NODES, up);
+
+        // try restart
+        ns1 = new DocumentMK.Builder().
+                setDocumentStore(mem).
+                setAsyncDelay(0).
+                setLeaseCheck(false).
+                getNodeStore();
+ 
+        assertEquals("should have re-used existing cluster id", cid, ns1.getClusterId());
+    }
+
     @After
     public void tearDown(){
         ClusterNodeInfo.resetClockToDefault();

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterJoinTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterJoinTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterJoinTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterJoinTest.java Thu Dec 17 09:52:40 2015
@@ -38,6 +38,7 @@ public class ClusterJoinTest extends Abs
         DocumentMK mk2 = new DocumentMK.Builder().
                 setAsyncDelay(0).
                 setMongoDB(connectionFactory.getConnection().getDB()).
+                setClusterId(mk.getNodeStore().getClusterId() + 1).
                 open();
 
         try {

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterTest.java Thu Dec 17 09:52:40 2015
@@ -164,14 +164,6 @@ public class ClusterTest {
     }
 
     @Test
-    public void clusterNodeId() {
-        DocumentMK mk1 = createMK(0);
-        DocumentMK mk2 = createMK(0);
-        assertEquals(1, mk1.getClusterInfo().getId());
-        assertEquals(2, mk2.getClusterInfo().getId());
-    }
-
-    @Test
     public void clusterBranchInVisibility() throws InterruptedException {
         DocumentMK mk1 = createMK(1);
         mk1.commit("/", "+\"regular\": {}", null, null);

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentConflictTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentConflictTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentConflictTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentConflictTest.java Thu Dec 17 09:52:40 2015
@@ -57,13 +57,13 @@ public class ConcurrentConflictTest exte
     public void initDocumentMK() {
         logBuffer.setLength(0);
         this.store = new MemoryDocumentStore();
-        DocumentMK mk = openDocumentMK();
+        DocumentMK mk = openDocumentMK(1);
         for (int i = 0; i < NUM_NODES; i++) {
             mk.commit("/", "+\"node-" + i + "\":{\"value\":100}", null, null);
         }
         mk.dispose();
         for (int i = 0; i < NUM_WRITERS; i++) {
-            kernels.add(openDocumentMK());
+            kernels.add(openDocumentMK(i + 2));
         }
     }
 
@@ -77,8 +77,8 @@ public class ConcurrentConflictTest exte
         kernels.clear();
     }
 
-    private DocumentMK openDocumentMK() {
-        return new DocumentMK.Builder().setAsyncDelay(10).setDocumentStore(store).open();
+    private DocumentMK openDocumentMK(int clusterId) {
+        return new DocumentMK.Builder().setAsyncDelay(10).setDocumentStore(store).setClusterId(clusterId).open();
     }
 
     @Test
@@ -198,7 +198,7 @@ public class ConcurrentConflictTest exte
         for (DocumentMK mk : kernels) {
             mk.dispose();
         }
-        DocumentMK mk = openDocumentMK();
+        DocumentMK mk = openDocumentMK(1);
         String rev = mk.getHeadRevision();
         long sum = calculateSum(mk, rev);
         log("Conflict rate: " + conflicts.get() +

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java Thu Dec 17 09:52:40 2015
@@ -675,9 +675,11 @@ public class DocumentNodeStoreTest {
     public void updateClusterState() {
         DocumentStore docStore = new MemoryDocumentStore();
         DocumentNodeStore ns1 = builderProvider.newBuilder().setAsyncDelay(0)
-                .setDocumentStore(docStore).getNodeStore();
+                .setClusterId(1).setDocumentStore(docStore)
+                .getNodeStore();
         DocumentNodeStore ns2 = builderProvider.newBuilder().setAsyncDelay(0)
-                .setDocumentStore(docStore).getNodeStore();
+                .setClusterId(2).setDocumentStore(docStore)
+                .getNodeStore();
 
         ns1.updateClusterState();
         ns2.updateClusterState();
@@ -742,7 +744,8 @@ public class DocumentNodeStoreTest {
 
         DocumentNodeStore store1 = builderProvider.newBuilder()
                 .setDocumentStore(docStore)
-                .setAsyncDelay(0).clock(clock).getNodeStore();
+                .setAsyncDelay(0).clock(clock).setClusterId(1)
+                .getNodeStore();
 
         NodeBuilder builder = store1.getRoot().builder();
         builder.child("test");
@@ -770,7 +773,8 @@ public class DocumentNodeStoreTest {
         // start a second store
         DocumentNodeStore store2 = builderProvider.newBuilder()
                 .setDocumentStore(docStore)
-                .setAsyncDelay(0).clock(clock).getNodeStore();
+                .setAsyncDelay(0).clock(clock).setClusterId(2)
+                .getNodeStore();
         // must see /test/node
         assertTrue(store2.getRoot().getChildNode("test").getChildNode("node").exists());
     }
@@ -1143,7 +1147,8 @@ public class DocumentNodeStoreTest {
         c1.waitUntil(now);
         Revision.setClock(c1);
         DocumentNodeStore ns1 = builderProvider.newBuilder().clock(c1)
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0).setClusterId(1)
+                .getNodeStore();
         NodeBuilder b1 = ns1.getRoot().builder();
         b1.child("node");
         merge(ns1, b1);
@@ -1157,7 +1162,8 @@ public class DocumentNodeStoreTest {
         Revision.setClock(c2);
 
         DocumentNodeStore ns2 = builderProvider.newBuilder().clock(c2)
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0).setClusterId(2)
+                .getNodeStore();
         // ns2 sees /node
         assertTrue(ns2.getRoot().hasChildNode("node"));
 
@@ -1538,7 +1544,8 @@ public class DocumentNodeStoreTest {
         c1.waitUntil(now);
         Revision.setClock(c1);
         DocumentNodeStore ns1 = builderProvider.newBuilder().clock(c1)
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0)
+                .setClusterId(1).getNodeStore();
         NodeBuilder b1 = ns1.getRoot().builder();
         b1.child("node");
         merge(ns1, b1);
@@ -1552,7 +1559,8 @@ public class DocumentNodeStoreTest {
         Revision.setClock(c2);
 
         DocumentNodeStore ns2 = builderProvider.newBuilder().clock(c2)
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0)
+                .setClusterId(2).getNodeStore();
         // ns2 sees /node
         assertTrue(ns2.getRoot().hasChildNode("node"));
 
@@ -1589,7 +1597,8 @@ public class DocumentNodeStoreTest {
         c1.waitUntil(now);
         Revision.setClock(c1);
         DocumentNodeStore ns1 = builderProvider.newBuilder().clock(c1)
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0)
+                .setClusterId(1).getNodeStore();
         NodeBuilder b1 = ns1.getRoot().builder();
         b1.child("node").setProperty("p", 1);
         merge(ns1, b1);
@@ -1603,7 +1612,8 @@ public class DocumentNodeStoreTest {
         Revision.setClock(c2);
 
         DocumentNodeStore ns2 = builderProvider.newBuilder().clock(c2)
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0)
+                .setClusterId(2).getNodeStore();
         // ns2 sees /node
         assertTrue(ns2.getRoot().hasChildNode("node"));
         assertEquals(1, ns2.getRoot().getChildNode("node").getProperty("p").getValue(Type.LONG).longValue());
@@ -1637,9 +1647,11 @@ public class DocumentNodeStoreTest {
     public void notYetVisibleExceptionMessage() throws Exception {
         MemoryDocumentStore store = new MemoryDocumentStore();
         DocumentNodeStore ns1 = builderProvider.newBuilder()
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0)
+                .setClusterId(1).getNodeStore();
         DocumentNodeStore ns2 = builderProvider.newBuilder()
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0)
+                .setClusterId(2).getNodeStore();
         ns2.setMaxBackOffMillis(0);
 
         NodeBuilder b1 = ns1.getRoot().builder();
@@ -1695,10 +1707,12 @@ public class DocumentNodeStoreTest {
         MemoryDocumentStore store = new MemoryDocumentStore();
         DocumentNodeStore ns1 = builderProvider.newBuilder()
                 .setAsyncDelay(0).clock(clock)
-                .setDocumentStore(store).getNodeStore();
+                .setDocumentStore(store)
+                .setClusterId(1).getNodeStore();
         DocumentNodeStore ns2 = builderProvider.newBuilder()
                 .setAsyncDelay(0).clock(clock)
-                .setDocumentStore(store).getNodeStore();
+                .setDocumentStore(store)
+                .setClusterId(2).getNodeStore();
 
         // create some children under /foo/bar
         NodeBuilder b1 = ns1.getRoot().builder();
@@ -2483,9 +2497,11 @@ public class DocumentNodeStoreTest {
     public void sameSeenAtRevision() throws Exception {
         MemoryDocumentStore store = new MemoryDocumentStore();
         DocumentNodeStore ns1 = builderProvider.newBuilder()
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0)
+                .setClusterId(1).getNodeStore();
         DocumentNodeStore ns2 = builderProvider.newBuilder()
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0)
+                .setClusterId(2).getNodeStore();
 
         NodeBuilder b2 = ns2.getRoot().builder();
         b2.child("test");
@@ -2500,7 +2516,8 @@ public class DocumentNodeStoreTest {
         ns1.runBackgroundOperations();
 
         DocumentNodeStore ns3 = builderProvider.newBuilder()
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0)
+                .setClusterId(3).getNodeStore();
         ns3.setMaxBackOffMillis(0);
         NodeBuilder b3 = ns3.getRoot().builder();
         assertFalse(b3.hasChildNode("test"));
@@ -2513,9 +2530,11 @@ public class DocumentNodeStoreTest {
     public void sameSeenAtRevision2() throws Exception {
         MemoryDocumentStore store = new MemoryDocumentStore();
         DocumentNodeStore ns1 = builderProvider.newBuilder()
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0)
+                .setClusterId(1).getNodeStore();
         DocumentNodeStore ns2 = builderProvider.newBuilder()
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0)
+                .setClusterId(2).getNodeStore();
 
         NodeBuilder b2 = ns2.getRoot().builder();
         b2.child("test");
@@ -2533,7 +2552,8 @@ public class DocumentNodeStoreTest {
         ns1.runBackgroundOperations();
 
         DocumentNodeStore ns3 = builderProvider.newBuilder()
-                .setDocumentStore(store).setAsyncDelay(0).getNodeStore();
+                .setDocumentStore(store).setAsyncDelay(0)
+                .setClusterId(3).getNodeStore();
         ns3.setMaxBackOffMillis(0);
         NodeBuilder b3 = ns3.getRoot().builder();
         assertTrue(b3.hasChildNode("test"));

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java Thu Dec 17 09:52:40 2015
@@ -751,7 +751,7 @@ public class DocumentSplitTest extends B
         ns1.runBackgroundOperations();
 
         DocumentNodeStore ns2 = new DocumentMK.Builder().setDocumentStore(store)
-                .setAsyncDelay(0).getNodeStore();
+                .setAsyncDelay(0).setClusterId(ns1.getClusterId() + 1).getNodeStore();
         // prevent merge retries
         ns2.setMaxBackOffMillis(0);
         assertTrue(ns2.getRoot().hasChildNode("test"));

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java Thu Dec 17 09:52:40 2015
@@ -327,10 +327,10 @@ public class JournalTest extends Abstrac
     }
     
     private void doLastRevRecoveryJournalTest(boolean testConcurrency) throws Exception {
-        DocumentMK mk1 = createMK(0 /*clusterId via clusterNodes collection*/, 0);
+        DocumentMK mk1 = createMK(1, 0);
         DocumentNodeStore ds1 = mk1.getNodeStore();
         int c1Id = ds1.getClusterId();
-        DocumentMK mk2 = createMK(0 /*clusterId via clusterNodes collection*/, 0);
+        DocumentMK mk2 = createMK(2, 0);
         DocumentNodeStore ds2 = mk2.getNodeStore();
         final int c2Id = ds2.getClusterId();
         

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java Thu Dec 17 09:52:40 2015
@@ -99,6 +99,7 @@ public class LastRevRecoveryAgentTest {
                 .clock(clock)
                 .setDocumentStore(store)
                 .setLeaseCheck(false)
+                .setClusterId(1)
                 .getNodeStore();
         c1Id = ds1.getClusterId();
 
@@ -107,6 +108,7 @@ public class LastRevRecoveryAgentTest {
                 .clock(clock)
                 .setDocumentStore(store)
                 .setLeaseCheck(false)
+                .setClusterId(2)
                 .getNodeStore();
         c2Id = ds2.getClusterId();
     }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryTest.java Thu Dec 17 09:52:40 2015
@@ -67,6 +67,7 @@ public class LastRevRecoveryTest {
                 .setLeaseCheck(leaseCheck)
                 .setAsyncDelay(0)
                 .setDocumentStore(sharedStore)
+                .setClusterId(1)
                 .getNodeStore();
         c1Id = ds1.getClusterId();
 
@@ -75,6 +76,7 @@ public class LastRevRecoveryTest {
                 .setLeaseCheck(leaseCheck)
                 .setAsyncDelay(0)
                 .setDocumentStore(sharedStore)
+                .setClusterId(2)
                 .getNodeStore();
         c2Id = ds2.getClusterId();
     }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java Thu Dec 17 09:52:40 2015
@@ -228,7 +228,7 @@ public class NodeDocumentTest {
         for (int i = 0; i < NUM_CLUSTER_NODES; i++) {
             DocumentNodeStore ns = new DocumentMK.Builder()
                     .setDocumentStore(store)
-                    .setAsyncDelay(0).getNodeStore();
+                    .setAsyncDelay(0).setClusterId(i + 1).getNodeStore();
             docStores.add(ns);
         }
         Random r = new Random(42);
@@ -385,8 +385,8 @@ public class NodeDocumentTest {
     @Test
     public void getNewestRevision() throws Exception {
         MemoryDocumentStore store = new MemoryDocumentStore();
-        DocumentNodeStore ns1 = createTestStore(store, 0);
-        DocumentNodeStore ns2 = createTestStore(store, 0);
+        DocumentNodeStore ns1 = createTestStore(store, 1, 0);
+        DocumentNodeStore ns2 = createTestStore(store, 2, 0);
 
         NodeBuilder b1 = ns1.getRoot().builder();
         b1.child("test");
@@ -473,7 +473,7 @@ public class NodeDocumentTest {
     @Test
     public void getNewestRevisionCheckArgument() throws Exception {
         MemoryDocumentStore store = new MemoryDocumentStore();
-        DocumentNodeStore ns = createTestStore(store, 0);
+        DocumentNodeStore ns = createTestStore(store, 0, 0);
 
         NodeBuilder builder = ns.getRoot().builder();
         builder.child("test");
@@ -521,8 +521,8 @@ public class NodeDocumentTest {
         final int numChanges = 200;
         Random random = new Random();
         MemoryDocumentStore store = new MemoryDocumentStore();
-        DocumentNodeStore ns1 = createTestStore(store, 0);
-        DocumentNodeStore ns2 = createTestStore(store, 0);
+        DocumentNodeStore ns1 = createTestStore(store, 1, 0);
+        DocumentNodeStore ns2 = createTestStore(store, 2, 0);
         List<DocumentNodeStore> nodeStores = Lists.newArrayList(ns1, ns2);
 
         for (int i = 0; i < numChanges; i++) {
@@ -570,7 +570,7 @@ public class NodeDocumentTest {
                 return super.find(collection, key);
             }
         };
-        DocumentNodeStore ns = createTestStore(store, numChanges);
+        DocumentNodeStore ns = createTestStore(store, 0, numChanges);
         NodeDocument doc = getRootDocument(store);
         Map<Revision, String> valueMap = doc.getValueMap("p");
         assertEquals(200, valueMap.size());
@@ -587,14 +587,15 @@ public class NodeDocumentTest {
     }
 
     private DocumentNodeStore createTestStore(int numChanges) throws Exception {
-        return createTestStore(new MemoryDocumentStore(), numChanges);
+        return createTestStore(new MemoryDocumentStore(), 0, numChanges);
     }
 
     private DocumentNodeStore createTestStore(DocumentStore store,
+                                              int clusterId,
                                               int numChanges) throws Exception {
         DocumentNodeStore ns = new DocumentMK.Builder()
                 .setDocumentStore(store)
-                .setAsyncDelay(0).getNodeStore();
+                .setAsyncDelay(0).setClusterId(clusterId).getNodeStore();
         for (int i = 0; i < numChanges; i++) {
             NodeBuilder builder = ns.getRoot().builder();
             builder.setProperty("p", i);

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/impl/DocumentMKConcurrentAddTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/impl/DocumentMKConcurrentAddTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/impl/DocumentMKConcurrentAddTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/impl/DocumentMKConcurrentAddTest.java Thu Dec 17 09:52:40 2015
@@ -43,10 +43,10 @@ public class DocumentMKConcurrentAddTest
 
     private List<DocumentMK> mks = new ArrayList<DocumentMK>();
 
-    private DocumentMK createMicroKernel() throws Exception {
+    private DocumentMK createMicroKernel(int clusterId) throws Exception {
         MongoConnection connection = connectionFactory.getConnection();
         DB mongoDB = connection.getDB();
-        return new DocumentMK.Builder().memoryCacheSize(CACHE_SIZE).setMongoDB(mongoDB).open();
+        return new DocumentMK.Builder().memoryCacheSize(CACHE_SIZE).setMongoDB(mongoDB).setClusterId(clusterId).open();
     }
 
     @After
@@ -58,7 +58,7 @@ public class DocumentMKConcurrentAddTest
     }
 
     /**
-     * Creates NB_THREADS microkernels, each commiting two nodes (one parent,
+     * Creates NB_THREADS microkernels, each committing two nodes (one parent,
      * one child) in its own thread. The nodes being committed by separate
      * threads do not overlap / conflict.
      *
@@ -70,7 +70,8 @@ public class DocumentMKConcurrentAddTest
         List<Callable<String>> cs = new LinkedList<Callable<String>>();
         for (int i = 0; i < NB_THREADS; i++) {
             // each callable has its own microkernel
-            final DocumentMK mk = createMicroKernel();
+            // (try to assign a cluster id different from all other already existing nodes stores)
+            final DocumentMK mk = createMicroKernel(super.mk.getNodeStore().getClusterId() + 1 + i);
             mks.add(mk);
             // diff for adding one node and one child node
             final List<String> stmts = new LinkedList<String>();

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java Thu Dec 17 09:52:40 2015
@@ -43,7 +43,7 @@ public class ClusterConflictTest extends
     @Override
     public void setUpConnection() throws Exception {
         super.setUpConnection();
-        ns2 = newBuilder(connectionFactory.getConnection().getDB()).getNodeStore();
+        ns2 = newBuilder(connectionFactory.getConnection().getDB()).setClusterId(2).getNodeStore();
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/CollisionMarkerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/CollisionMarkerTest.java?rev=1720500&r1=1720499&r2=1720500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/CollisionMarkerTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/CollisionMarkerTest.java Thu Dec 17 09:52:40 2015
@@ -50,7 +50,7 @@ public class CollisionMarkerTest extends
     public void setUpConnection() throws Exception {
         mongoConnection = connectionFactory.getConnection();
         MongoUtils.dropCollections(mongoConnection.getDB());
-        mk = newDocumentMK(mongoConnection.getDB());
+        mk = newDocumentMK(mongoConnection.getDB(), 2);
         ns1 = mk.getNodeStore();
     }
 
@@ -69,7 +69,7 @@ public class CollisionMarkerTest extends
         ns1.runBackgroundOperations();
         // initialize second node store after background ops
         // on ns1. this makes sure ns2 sees all changes done so far
-        ns2 = newDocumentMK(connectionFactory.getConnection().getDB()).getNodeStore();
+        ns2 = newDocumentMK(connectionFactory.getConnection().getDB(), 3).getNodeStore();
 
         b1 = ns1.getRoot().builder();
         b1.child("node").child("foo");
@@ -93,10 +93,12 @@ public class CollisionMarkerTest extends
                 " committed revision", root.getValueMap(COLLISIONS).containsKey(head));
     }
 
-    private static DocumentMK newDocumentMK(DB db) {
+    private static DocumentMK newDocumentMK(DB db, int clusterId) {
         DocumentMK mk = new DocumentMK.Builder().setAsyncDelay(0)
                 .setLeaseCheck(false)
-                .setMongoDB(db).open();
+                .setMongoDB(db)
+                .setClusterId(clusterId)
+                .open();
         // do not retry on conflicts
         mk.getNodeStore().setMaxBackOffMillis(0);
         return mk;