From 9737dd7d653611c9d9ee38640685a68d43abbca4 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 17 Apr 2014 15:05:17 +0000
Subject: [PATCH] OPENDJ-1440 On startup, change number can progress without waiting for any heartbeat from known replicas

---
 opends/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexer.java |   30 +++++++++++++++++++++++++++++-
 1 files changed, 29 insertions(+), 1 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexer.java b/opends/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexer.java
index 1fe38e0..99870ed 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexer.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexer.java
@@ -267,6 +267,23 @@
           lastAliveCSNs.getCSN(mc.getFirst(), mcCSN.getServerId());
       return mcCSN.isOlderThan(lastTimeSameReplicaSeenAlive);
     }
+    // ensure that all initial replicas alive information have been updated
+    // with CSNs that are acceptable for moving the medium consistency forward
+    return allInitialReplicasArePastOldestPossibleCSN();
+  }
+
+  private boolean allInitialReplicasArePastOldestPossibleCSN()
+  {
+    for (DN baseDN : lastAliveCSNs)
+    {
+      for (CSN csn : lastAliveCSNs.getServerState(baseDN))
+      {
+        if (csn.getTime() == 0)
+        {
+          return false;
+        }
+      }
+    }
     return true;
   }
 
@@ -301,8 +318,14 @@
 
       for (Integer serverId : entry.getValue())
       {
-        final CSN csn = mediumConsistencyRUV.getCSN(baseDN, serverId);
+        /*
+         * initialize with the oldest possible CSN in order for medium
+         * consistency to wait for all replicas to be alive before moving
+         * forward
+         */
+        lastAliveCSNs.update(baseDN, oldestPossibleCSN(serverId));
         // start after the actual CSN when initializing from the previous cookie
+        final CSN csn = mediumConsistencyRUV.getCSN(baseDN, serverId);
         ensureCursorExists(baseDN, serverId, csn);
       }
 
@@ -332,6 +355,11 @@
     this.changelogState = null;
   }
 
+  private CSN oldestPossibleCSN(int serverId)
+  {
+    return new CSN(0, 0, serverId);
+  }
+
   private void resetNextChangeForInsertDBCursor() throws ChangelogException
   {
     final Map<DBCursor<UpdateMsg>, DN> cursors =

--
Gitblit v1.10.0