From 25bd113aca0224d16369621fbfb68e0f639c4162 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 13 Nov 2013 13:16:10 +0000
Subject: [PATCH] Complement of r9789

---
 opends/src/server/org/opends/server/replication/server/ECLServerHandler.java |   24 ++++++++++++++----------
 1 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java b/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
index 98bc563..d60dab0 100644
--- a/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
@@ -795,8 +795,7 @@
       }
       else
       {
-        // let's take the start state for this domain from the provided
-        // cookie
+        // let's take the start state for this domain from the provided cookie
         newDomainCtxt.startState =
             startStatesFromProvidedCookie.remove(domain.getBaseDN());
 
@@ -867,6 +866,7 @@
     */
     if (!startStatesFromProvidedCookie.isEmpty() && allowUnknownDomains)
     {
+      // JNR: Will the following code trigger a ConcurrentModificationException?
       for (DN providedDomain : startStatesFromProvidedCookie.keySet())
         if (rs.getReplicationServerDomain(providedDomain) == null)
           // the domain provided in the cookie is not replicated
@@ -1039,17 +1039,16 @@
     isPersistent  = startECLSessionMsg.isPersistent();
     lastChangeNumber = startECLSessionMsg.getLastChangeNumber();
     searchPhase   = INIT_PHASE;
+    final String cookie = startECLSessionMsg.getCrossDomainServerState();
     try
     {
-      previousCookie = new MultiDomainServerState(
-        startECLSessionMsg.getCrossDomainServerState());
+      previousCookie = new MultiDomainServerState(cookie);
     }
     catch(Exception e)
     {
       TRACER.debugCaught(DebugLogLevel.ERROR, e);
-      throw new DirectoryException(
-          ResultCode.PROTOCOL_ERROR,
-          ERR_INVALID_COOKIE_SYNTAX.get());
+      throw new DirectoryException(ResultCode.PROTOCOL_ERROR,
+          ERR_INVALID_COOKIE_SYNTAX.get(cookie));
     }
 
     excludedBaseDNs = startECLSessionMsg.getExcludedBaseDNs();
@@ -1236,9 +1235,7 @@
         oldestContext.currentState.update(change.getUpdateMsg().getCSN());
 
         if (oldestContext.currentState.cover(oldestContext.stopState)
-            || (draftCompat
-                && lastChangeNumber > 0
-                && change.getChangeNumber() > lastChangeNumber))
+            || isBeyondLastRequestedChangeNumber(change))
         {
           oldestContext.active = false;
         }
@@ -1298,6 +1295,13 @@
     return oldestChange;
   }
 
+  private boolean isBeyondLastRequestedChangeNumber(final ECLUpdateMsg change)
+  {
+    return draftCompat
+        && 0 < lastChangeNumber
+        && lastChangeNumber < change.getChangeNumber();
+  }
+
   private ECLUpdateMsg newECLUpdateMsg(DomainContext ctx)
   {
     // cookie will be set later AND changeNumber may be set later

--
Gitblit v1.10.0