From f5efc93e858375f6b8e44eb1c04918372ae93f1b Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Wed, 09 Dec 2009 09:24:11 +0000
Subject: [PATCH] Fix #4361 ECL - draft mode: temporary fake lastChangeNumber after thousands of updates
---
opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java | 100 ++++++++++++++------------------------------------
1 files changed, 28 insertions(+), 72 deletions(-)
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java b/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
index d3d0aa5..dc1b8c7 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
@@ -1402,7 +1402,7 @@
* for the provided server Id.
*/
public ReplicationIterator getChangelogIterator(int serverId,
- ChangeNumber changeNumber)
+ ChangeNumber changeNumber)
{
DbHandler handler = sourceDbHandlers.get(serverId);
if (handler == null)
@@ -1423,6 +1423,25 @@
}
}
+ /**
+ * Count the number of changes in the replication changelog for the provided
+ * serverID, between 2 provided changenumbers.
+ * @param serverId Identifier of the server for which the iterator is created.
+ * @param from lower limit changenumber.
+ * @param to upper limit changenumber.
+ * @return the number of changes.
+ *
+ */
+ public int getCount(int serverId,
+ ChangeNumber from, ChangeNumber to)
+ {
+ DbHandler handler = sourceDbHandlers.get(serverId);
+ if (handler == null)
+ return 0;
+
+ return handler.getCount(from, to);
+ }
+
/**
* Creates and returns an iterator.
* When the iterator is not used anymore, the caller MUST call the
@@ -3358,81 +3377,18 @@
public long getEligibleCount(ServerState startState, ChangeNumber endCN)
{
long res = 0;
- ReplicationIterator ri=null;
// Parses the dbState of the domain , server by server
ServerState dbState = this.getDbServerState();
- Iterator<Integer> it = dbState.iterator();
- while (it.hasNext())
+ Iterator<Integer> serverIDIterator = dbState.iterator();
+ while (serverIDIterator.hasNext())
{
- // for each server
- int sid = it.next();
- DbHandler h = sourceDbHandlers.get(sid);
-
- try
- {
- // Set on the change related to the startState
- ChangeNumber startCN = null;
- try
- {
- ri = h.generateIterator(startState.getMaxChangeNumber(sid));
- if (ri.next()==true)
- {
- startCN = ri.getChange().getChangeNumber();
- }
- }
- catch(Exception e)
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- startCN = null;
- }
- finally
- {
- if (ri!=null)
- {
- ri.releaseCursor();
- ri = null;
- }
- }
-
- if (startCN != null)
- {
- // Set on the change related to the endCN
- ChangeNumber upperCN = null;
- try
- {
- // Build a changenumber for this very server, with the timestamp
- // of the endCN
- ChangeNumber f = new ChangeNumber(endCN.getTime(), 0, sid);
- ri = h.generateIterator(f);
- if (ri.next()==true)
- {
- upperCN = ri.getChange().getChangeNumber();
- }
- }
- catch(Exception e)
- {
- upperCN = h.getLastChange();
- }
- finally
- {
- if (ri!=null)
- {
- ri.releaseCursor();
- ri = null;
- }
- }
-
- long diff = upperCN.getSeqnum() - startCN.getSeqnum() + 1;
-
- res += diff;
- }
- // TODO:ECL We should compute if changenumber.seqnum has turned !
- }
- catch(Exception e)
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
+ // process one sid
+ int sid = serverIDIterator.next();
+ ChangeNumber startCN = null;
+ if (startState.getMaxChangeNumber(sid) != null)
+ startCN = startState.getMaxChangeNumber(sid);
+ res += getCount(sid, startCN, endCN);
}
return res;
}
--
Gitblit v1.10.0