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