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 15:02:29 UTC

svn commit: r1720552 - in /jackrabbit/oak/branches/1.2: ./ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/do...

Author: reschke
Date: Thu Dec 17 14:02:28 2015
New Revision: 1720552

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

Modified:
    jackrabbit/oak/branches/1.2/   (props changed)
    jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ClusterNodeInfo.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterJoinTest.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterTest.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentConflictTest.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryTest.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/impl/DocumentMKConcurrentAddTest.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java

Propchange: jackrabbit/oak/branches/1.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Dec 17 14:02:28 2015
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414-1673415,1673436,1673644,1673662-1673664,1673669,1673695,1673713,1673738,1673787,1673791,1674046,1674065,1674075,1674107,1674228,1674780,1674880,1675054-1675055,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677804,1677806,1677939,1677991,1678023,1678095-1678096,1678124,1678171,1678173,1678211,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679232,1679235,1679503,1679958,1679961,1680170,1680172,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680747,1680805-1680806,1680903,1681282,1681767,1681918,1681921,1681955,1682042,1682218,1682235,1682437,1682494,1682555,1682855,1682904,1683059,1683089,1683213,1683249,1683259,1683278,1683323,1683687,1683700,1684174-1684175,1684186,1684376,1684442,1684561,1684570,1684601,1684618
 ,1684820,1684868,1685023,1685075,1685370,1685552,1685589-1685590,1685840,1685964,1685977,1685989,1685999,1686023,1686032,1686097,1686162,1686229,1686234,1686253,1686414,1686780,1686854,1686857,1686971,1687053-1687055,1687175,1687196,1687198,1687220,1687239-1687240,1687301,1687441,1687553,1688089-1688090,1688172,1688179,1688349,1688421,1688436,1688453,1688616,1688622,1688634,1688636,1688817,1689003-1689004,1689008,1689577,1689581,1689623,1689810,1689828,1689831,1689833,1689903,1690017,1690043,1690047,1690057,1690247,1690249,1690634-1690637,1690650,1690669,1690674,1690885,1690941,1691139,1691151,1691159,1691167,1691183,1691188,1691210,1691280,1691307,1691331-1691333,1691345,1691384-1691385,1691401,1691509,1692133-1692134,1692156,1692250,1692274,1692363,1692382,1692478,1692955,1693002,1693030,1693050,1693209,1693421,1693525-1693526,1694007,1694393-1694394,1694651,1694653-1694654,1695032,1695050,1695122,1695280,1695299,1695420,1695457,1695482,1695492,1695507,1695521,1695540,1695571,1695
 905,1696190,1696194,1696242,1696285,1696375,1696522,1696578,1696759,1696916,1697363,1697373,1697410,1697582,1697589,1697616,1697672,1700191,1700231,1700397,1700403,1700506,1700571,1700718,1700727,1700749,1700769,1700775,1701065,1701619,1701733,1701743,1701750,1701768,1701806,1701810,1701814,1701948,1701955,1701959,1701965,1701986,1702014,1702022,1702045,1702051,1702241,1702272,1702387,1702405,1702423,1702860,1702942,1702960,1703212,1703382,1703395,1703411,1703428,1703430,1703568,1703592,1703758,1703858,1703878,1704256,1704282,1704285,1704457,1704479,1704490,1704614,1704629,1704636,1704655,1704670,1704886,1705005,1705027,1705043,1705055,1705250,1705268,1705273,1705323,1705677,1705701,1705871,1705992,1705998,1706009,1706037,1706059,1706212,1706218,1706270,1706764,1706772,1707049,1707191,1707435,1707509,1708105,1708315,1708546,1708592,1708766,1709012,1709852,1709978,1710013,1710031,1710049,1710205,1710242,1710559,1710575,1710590,1710614,1710637,1710789,1710800,1710811,1710816,1710972,1
 711248,1711282,1711296,1711498,1711654,1712018,1712042,1712319,1712490,1712531,1712730,1712785,1712963,1713008,1713439,1713461,1713580,1713586,1713599-1713600,1713626,1713698,1713803,1713809,1714034,1714061,1714084,1714170,1714213,1714229,1714238,1714519-1714520,1714543-1714544,1714730,1714739,1714779,1714956,1714961,1715010,1715191,1715346,1715767,1715771,1715888,1715898,1716178,1716426,1716576,1716596,1716616,1716703,1716712,1716815,1716823,1716830,1716883,1717277,1717462,1717632,1717784,1717988,1718626,1718646,1718801,1718895,1719111,1719288,1720335
+/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414-1673415,1673436,1673644,1673662-1673664,1673669,1673695,1673713,1673738,1673787,1673791,1674046,1674065,1674075,1674107,1674228,1674780,1674880,1675054-1675055,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677804,1677806,1677939,1677991,1678023,1678095-1678096,1678124,1678171,1678173,1678211,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679232,1679235,1679503,1679958,1679961,1680170,1680172,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680747,1680805-1680806,1680903,1681282,1681767,1681918,1681921,1681955,1682042,1682218,1682235,1682437,1682494,1682555,1682855,1682904,1683059,1683089,1683213,1683249,1683259,1683278,1683323,1683687,1683700,1684174-1684175,1684186,1684376,1684442,1684561,1684570,1684601,1684618
 ,1684820,1684868,1685023,1685075,1685370,1685552,1685589-1685590,1685840,1685964,1685977,1685989,1685999,1686023,1686032,1686097,1686162,1686229,1686234,1686253,1686414,1686780,1686854,1686857,1686971,1687053-1687055,1687175,1687196,1687198,1687220,1687239-1687240,1687301,1687441,1687553,1688089-1688090,1688172,1688179,1688349,1688421,1688436,1688453,1688616,1688622,1688634,1688636,1688817,1689003-1689004,1689008,1689577,1689581,1689623,1689810,1689828,1689831,1689833,1689903,1690017,1690043,1690047,1690057,1690247,1690249,1690634-1690637,1690650,1690669,1690674,1690885,1690941,1691139,1691151,1691159,1691167,1691183,1691188,1691210,1691280,1691307,1691331-1691333,1691345,1691384-1691385,1691401,1691509,1692133-1692134,1692156,1692250,1692274,1692363,1692382,1692478,1692955,1693002,1693030,1693050,1693209,1693421,1693525-1693526,1694007,1694393-1694394,1694651,1694653-1694654,1695032,1695050,1695122,1695280,1695299,1695420,1695457,1695482,1695492,1695507,1695521,1695540,1695571,1695
 905,1696190,1696194,1696242,1696285,1696375,1696522,1696578,1696759,1696916,1697363,1697373,1697410,1697582,1697589,1697616,1697672,1700191,1700231,1700397,1700403,1700506,1700571,1700718,1700727,1700749,1700769,1700775,1701065,1701619,1701733,1701743,1701750,1701768,1701806,1701810,1701814,1701948,1701955,1701959,1701965,1701986,1702014,1702022,1702045,1702051,1702241,1702272,1702387,1702405,1702423,1702860,1702942,1702960,1703212,1703382,1703395,1703411,1703428,1703430,1703568,1703592,1703758,1703858,1703878,1704256,1704282,1704285,1704457,1704479,1704490,1704614,1704629,1704636,1704655,1704670,1704886,1705005,1705027,1705043,1705055,1705250,1705268,1705273,1705323,1705677,1705701,1705871,1705992,1705998,1706009,1706037,1706059,1706212,1706218,1706270,1706764,1706772,1707049,1707191,1707435,1707509,1708105,1708315,1708546,1708592,1708766,1709012,1709852,1709978,1710013,1710031,1710049,1710205,1710242,1710559,1710575,1710590,1710614,1710637,1710789,1710800,1710811,1710816,1710972,1
 711248,1711282,1711296,1711498,1711654,1712018,1712042,1712319,1712490,1712531,1712730,1712785,1712963,1713008,1713439,1713461,1713580,1713586,1713599-1713600,1713626,1713698,1713803,1713809,1714034,1714061,1714084,1714170,1714213,1714229,1714238,1714519-1714520,1714543-1714544,1714730,1714739,1714779,1714956,1714961,1715010,1715191,1715346,1715767,1715771,1715888,1715898,1716178,1716426,1716576,1716596,1716616,1716703,1716712,1716815,1716823,1716830,1716883,1717277,1717462,1717632,1717784,1717988,1718626,1718646,1718801,1718895,1719111,1719288,1720335,1720500
 /jackrabbit/trunk:1345480

Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ClusterNodeInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ClusterNodeInfo.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ClusterNodeInfo.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ClusterNodeInfo.java Thu Dec 17 14:02:28 2015
@@ -288,7 +288,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);
@@ -323,7 +323,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;
@@ -361,16 +361,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);
@@ -420,6 +429,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;
+    }
+
     /**
      * Renew the cluster id lease. This method needs to be called once in a while,
      * to ensure the same cluster id is not re-used by a different instance.

Modified: jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java Thu Dec 17 14:02:28 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;
@@ -49,10 +50,12 @@ public class ClusterInfoTest {
         DocumentNodeStore ns1 = new DocumentMK.Builder().
                 setDocumentStore(mem).
                 setAsyncDelay(0).
+                setClusterId(1).
                 getNodeStore();
         DocumentNodeStore ns2 = new DocumentMK.Builder().
                 setDocumentStore(mem).
                 setAsyncDelay(0).
+                setClusterId(2).
                 getNodeStore();
         // Bring the current time forward to after the leaseTime which would have been 
         // updated in the DocumentNodeStore initialization.
@@ -135,6 +138,42 @@ 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).
+                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).
+                getNodeStore();
+ 
+        assertEquals("should have re-used existing cluster id", cid, ns1.getClusterId());
+    }
+
     @After
     public void tearDown(){
         ClusterNodeInfo.resetClockToDefault();

Modified: jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterJoinTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterJoinTest.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterJoinTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterJoinTest.java Thu Dec 17 14:02:28 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/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterTest.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterTest.java Thu Dec 17 14:02:28 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/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentConflictTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentConflictTest.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentConflictTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentConflictTest.java Thu Dec 17 14:02:28 2015
@@ -59,13 +59,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));
         }
     }
 
@@ -79,8 +79,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();
     }
 
     @Ignore
@@ -201,7 +201,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/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java Thu Dec 17 14:02:28 2015
@@ -636,9 +636,9 @@ public class DocumentNodeStoreTest {
     public void updateClusterState() {
         DocumentStore docStore = new MemoryDocumentStore();
         DocumentNodeStore ns1 = builderProvider.newBuilder().setAsyncDelay(0)
-                .setDocumentStore(docStore).getNodeStore();
+                .setDocumentStore(docStore).setClusterId(1).getNodeStore();
         DocumentNodeStore ns2 = builderProvider.newBuilder().setAsyncDelay(0)
-                .setDocumentStore(docStore).getNodeStore();
+                .setDocumentStore(docStore).setClusterId(2).getNodeStore();
 
         ns1.updateClusterState();
         ns2.updateClusterState();
@@ -703,7 +703,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");
@@ -731,7 +732,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());
     }
@@ -1103,7 +1105,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);
@@ -1117,7 +1120,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"));
 
@@ -1486,7 +1490,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);
@@ -1500,7 +1505,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"));
 
@@ -1537,7 +1543,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);
@@ -1551,7 +1558,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());
@@ -1585,9 +1593,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();
@@ -2149,9 +2159,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");
@@ -2166,7 +2178,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"));
@@ -2179,9 +2192,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");
@@ -2199,7 +2214,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/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java Thu Dec 17 14:02:28 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/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/JournalTest.java Thu Dec 17 14:02:28 2015
@@ -315,10 +315,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/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryAgentTest.java Thu Dec 17 14:02:28 2015
@@ -98,6 +98,7 @@ public class LastRevRecoveryAgentTest {
                 .setAsyncDelay(0)
                 .clock(clock)
                 .setDocumentStore(store)
+                .setClusterId(1)
                 .getNodeStore();
         c1Id = ds1.getClusterId();
 
@@ -105,6 +106,7 @@ public class LastRevRecoveryAgentTest {
                 .setAsyncDelay(0)
                 .clock(clock)
                 .setDocumentStore(store)
+                .setClusterId(2)
                 .getNodeStore();
         c2Id = ds2.getClusterId();
     }

Modified: jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryTest.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecoveryTest.java Thu Dec 17 14:02:28 2015
@@ -48,12 +48,14 @@ public class LastRevRecoveryTest {
         ds1 = builderProvider.newBuilder()
                 .setAsyncDelay(0)
                 .setDocumentStore(sharedStore)
+                .setClusterId(1)
                 .getNodeStore();
         c1Id = ds1.getClusterId();
 
         ds2 = builderProvider.newBuilder()
                 .setAsyncDelay(0)
                 .setDocumentStore(sharedStore)
+                .setClusterId(2)
                 .getNodeStore();
         c2Id = ds2.getClusterId();
     }

Modified: jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java Thu Dec 17 14:02:28 2015
@@ -180,7 +180,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);
@@ -337,8 +337,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");
@@ -425,7 +425,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");
@@ -473,8 +473,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++) {
@@ -522,7 +522,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());
@@ -539,14 +539,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/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/impl/DocumentMKConcurrentAddTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/impl/DocumentMKConcurrentAddTest.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/impl/DocumentMKConcurrentAddTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/impl/DocumentMKConcurrentAddTest.java Thu Dec 17 14:02:28 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/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java?rev=1720552&r1=1720551&r2=1720552&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java Thu Dec 17 14:02:28 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