From 020a870af63f7407d3145feb74351bee3c2ce837 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 17 Dec 2013 11:08:12 +0000
Subject: [PATCH] OPENDJ-1231 (CR-2724) Make the Medium Consistency Point support replica heartbeats and replicas shutting down

---
 opends/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexer.java |   39 +++++++++++++++++++++++++++------------
 1 files changed, 27 insertions(+), 12 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 4c46759..40cccc9 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
@@ -101,12 +101,13 @@
   private volatile CSN mediumConsistencyCSN;
 
   /**
-   * Holds the most recent changes or heartbeats received for each serverIds
-   * cross domain. changes are stored in the replicaDBs and hence persistent,
-   * heartbeats are transient because they are easily constructed on normal
-   * operations.
+   * Holds the last time each replica was seen alive, whether via updates or
+   * heartbeats received. Data is held for each serverId cross domain.
+   * <p>
+   * Updates are persistent and stored in the replicaDBs, heartbeats are
+   * transient and are easily constructed on normal operations.
    */
-  private final MultiDomainServerState lastSeenUpdates =
+  private final MultiDomainServerState lastAliveCSNs =
       new MultiDomainServerState();
   private final MultiDomainServerState replicasOffline =
       new MultiDomainServerState();
@@ -174,7 +175,7 @@
    */
   public void publishHeartbeat(DN baseDN, CSN heartbeatCSN)
   {
-    lastSeenUpdates.update(baseDN, heartbeatCSN);
+    lastAliveCSNs.update(baseDN, heartbeatCSN);
     tryNotify(baseDN);
   }
 
@@ -192,13 +193,27 @@
       throws ChangelogException
   {
     final CSN csn = updateMsg.getCSN();
-    lastSeenUpdates.update(baseDN, csn);
+    lastAliveCSNs.update(baseDN, csn);
     // only keep the oldest CSN that will be the new cursor's starting point
     newCursors.putIfAbsent(Pair.of(baseDN, csn.getServerId()), csn);
     tryNotify(baseDN);
   }
 
   /**
+   * Returns the last time each serverId was seen alive for the specified
+   * replication domain.
+   *
+   * @param baseDN
+   *          the replication domain baseDN
+   * @return a new ServerState object holding the {serverId => CSN} Map. Can be
+   *         null if domain is not replicated.
+   */
+  public ServerState getDomainLastAliveCSNs(DN baseDN)
+  {
+    return lastAliveCSNs.getServerState(baseDN);
+  }
+
+  /**
    * Signals a replica went offline.
    *
    * @param baseDN
@@ -208,7 +223,7 @@
    */
   public void replicaOffline(DN baseDN, CSN offlineCSN)
   {
-    lastSeenUpdates.update(baseDN, offlineCSN);
+    lastAliveCSNs.update(baseDN, offlineCSN);
     replicasOffline.update(baseDN, offlineCSN);
     tryNotify(baseDN);
   }
@@ -234,8 +249,8 @@
     if (mcCSN != null)
     {
       final int serverId = mcCSN.getServerId();
-      final CSN lastSeenSameServerId = lastSeenUpdates.getCSN(baseDN, serverId);
-      return mcCSN.isOlderThan(lastSeenSameServerId);
+      CSN lastTimeSameReplicaSeenAlive = lastAliveCSNs.getCSN(baseDN, serverId);
+      return mcCSN.isOlderThan(lastTimeSameReplicaSeenAlive);
     }
     return true;
   }
@@ -269,7 +284,7 @@
       }
 
       ServerState latestKnownState = domainDB.getDomainNewestCSNs(baseDN);
-      lastSeenUpdates.update(baseDN, latestKnownState);
+      lastAliveCSNs.update(baseDN, latestKnownState);
     }
     resetNextChangeForInsertDBCursor();
 
@@ -491,7 +506,7 @@
     if (offlineCSN != null
         && offlineCSN.isOlderThan(mediumConsistencyCSN)
         // If no new updates has been seen for this replica
-        && lastSeenUpdates.removeCSN(baseDN, offlineCSN))
+        && lastAliveCSNs.removeCSN(baseDN, offlineCSN))
     {
       removeCursor(baseDN, csn);
       replicasOffline.removeCSN(baseDN, offlineCSN);

--
Gitblit v1.10.0