From 5c87cce021cba14003f8371f8e496aefe68724bc Mon Sep 17 00:00:00 2001
From: Ludovic Poitou <ludovic.poitou@forgerock.com>
Date: Thu, 09 Jun 2011 21:24:05 +0000
Subject: [PATCH] Fix issue OPENDJ-67: Investigate ECL change number consistency across replications servers which have been subjected to different purging policies.

---
 opendj-sdk/opends/src/server/org/opends/server/replication/server/DraftCNDbHandler.java |   39 ++++++++++++++++++++++++++++++++++++---
 1 files changed, 36 insertions(+), 3 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 9230497..0af06df 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
@@ -50,6 +50,8 @@
 import org.opends.server.types.InitializationException;
 
 import com.sleepycat.je.DatabaseException;
+import java.util.HashMap;
+import org.opends.server.replication.common.MultiDomainServerState;
 
 /**
  * This class is used for managing the replicationServer database for each
@@ -385,14 +387,45 @@
 
           int currentKey = cursor.currentKey();
 
-          // Do not delete the lastKey. This should allow us to
-          // preserve last change number over time.
-          if ((currentKey != lastkey) && (cn.older(fcn)))
+          if (cn.older(fcn))
           {
             cursor.delete();
             continue;
           }
 
+          ServerState cnVector = null;
+          try
+          {
+            HashMap<String,ServerState> cnStartStates =
+                MultiDomainServerState.splitGenStateToServerStates(
+                        cursor.currentValue());
+            cnVector = cnStartStates.get(serviceID);
+
+            if (debugEnabled())
+              TRACER.debugInfo("DraftCNDBHandler:clear() - ChangeVector:"+
+                      cnVector.toString()+
+                      " -- StartState:"+startState.toString());
+            // cnVector.update(cn);
+          }
+          catch(Exception e)
+          {
+            // We couldn't parse the mdss from the DraftCNData Value
+            assert(false);
+            cursor.delete();
+            continue;
+          }
+
+          if ((cnVector == null)
+                  || ((cnVector.getMaxChangeNumber(cn.getServerId()) != null)
+                      && !cnVector.cover(startState)))
+          {
+            cursor.delete();
+            if (debugEnabled())
+              TRACER.debugInfo("DraftCNDBHandler:clear() - deleted "+
+                      cn.toString()+"Not covering startState");
+            continue;
+          }
+
           firstkey = currentKey;
           cursor.close();
           return;

--
Gitblit v1.10.0