From 5aad2ec830722993dd6377748492aef95bb20324 Mon Sep 17 00:00:00 2001
From: ludovicp <ludovicp@localhost>
Date: Thu, 27 May 2010 09:24:42 +0000
Subject: [PATCH] Fix for issue with ECL in cookie mode: when building lastExternalChangelogCookie, we must ignore changes older than the purge date.

---
 opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java       |    2 +-
 opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java |   26 ++++++++++++++++++++++++--
 opendj-sdk/opends/src/server/org/opends/server/replication/server/DraftCNDbHandler.java        |    5 +++--
 opendj-sdk/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java        |    4 ++--
 4 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/DraftCNDbHandler.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/DraftCNDbHandler.java
index 0e1629c..b1a1e84 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/DraftCNDbHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/DraftCNDbHandler.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2009 Sun Microsystems, Inc.
+ *      Copyright 2009-2010 Sun Microsystems, Inc.
  */
 package org.opends.server.replication.server;
 import static org.opends.messages.ReplicationMessages.*;
@@ -386,7 +386,8 @@
             {
               // let's get the eligible part of the domain
               ServerState startSS = domain.getStartState();
-              ServerState endSS= domain.getEligibleState(crossDomainEligibleCN);
+              ServerState endSS= domain.getEligibleState(crossDomainEligibleCN,
+                  true);
 
               ChangeNumber fcn = startSS.getMaxChangeNumber(cn.getServerId());
               ChangeNumber lcn = endSS.getMaxChangeNumber(cn.getServerId());
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
index 279bfa7..c41073b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
@@ -738,7 +738,7 @@
           if (isPersistent ==
             StartECLSessionMsg.PERSISTENT_CHANGES_ONLY)
           {
-            newDomainCtxt.startState = rsd.getEligibleState(eligibleCN);
+            newDomainCtxt.startState = rsd.getEligibleState(eligibleCN, true);
           }
           else
           {
@@ -781,7 +781,7 @@
             }
 
             // Set the stop state for the domain from the eligibleCN
-            newDomainCtxt.stopState = rsd.getEligibleState(eligibleCN);
+            newDomainCtxt.stopState = rsd.getEligibleState(eligibleCN, true);
           }
           newDomainCtxt.currentState = new ServerState();
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
index 69efdd8..90aeddd 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -2072,7 +2072,7 @@
           continue;
 
         result.update(rsd.getBaseDn(), rsd.getEligibleState(
-            getEligibleCN()));
+            getEligibleCN(),false));
       }
     }
     return result;
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
index 1cefe98..46a9031 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
@@ -3119,10 +3119,13 @@
    *
    * The eligibleState is : s1;cn14 / s2;cn26 / s3;cn31
    *
-   * @param eligibleCN The provided eligibleCN.
+   * @param eligibleCN              The provided eligibleCN.
+   * @param allowOlderThanPurgeDate When true, the returned state can be older
+   *                                than the purge date of the domain.
    * @return The computed eligible server state.
    */
-  public ServerState getEligibleState(ChangeNumber eligibleCN)
+  public ServerState getEligibleState(ChangeNumber eligibleCN,
+      boolean allowOlderThanPurgeDate)
   {
     ServerState result = new ServerState();
 
@@ -3188,6 +3191,25 @@
         }
       }
     }
+
+    if (allowOlderThanPurgeDate == false)
+    {
+      boolean domainPurged = true;
+      long latestDomainTrimDate = getLatestDomainTrimDate();
+      Iterator<Integer> it = result.iterator();
+      while (it.hasNext())
+      {
+        int sid = it.next();
+        ChangeNumber cn = result.getMaxChangeNumber(sid);
+        if ((cn.getTime()>0) && (cn.getTime()<latestDomainTrimDate))
+          result.update(new ChangeNumber(0,0,sid));
+        else
+          domainPurged = false;
+      }
+      if (domainPurged == true)
+        result.clear();
+    }
+
     if (debugEnabled())
       TRACER.debugInfo("In " + this
         + " getEligibleState() result is " + result);

--
Gitblit v1.10.0