From 8a798db963b97a2933312815e3f57d89e93bc1c2 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 06 Jun 2014 14:44:24 +0000
Subject: [PATCH] OPENDJ-1453 (CR-3667) Change time heart beat change numbers should be synced with updates
---
opendj3-server-dev/src/server/org/opends/server/replication/common/MultiDomainServerState.java | 51 +++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 45 insertions(+), 6 deletions(-)
diff --git a/opendj3-server-dev/src/server/org/opends/server/replication/common/MultiDomainServerState.java b/opendj3-server-dev/src/server/org/opends/server/replication/common/MultiDomainServerState.java
index 094a82d..4bbdf88 100644
--- a/opendj3-server-dev/src/server/org/opends/server/replication/common/MultiDomainServerState.java
+++ b/opendj3-server-dev/src/server/org/opends/server/replication/common/MultiDomainServerState.java
@@ -38,6 +38,8 @@
import org.opends.server.types.DirectoryException;
import org.forgerock.opendj.ldap.ResultCode;
+import com.forgerock.opendj.util.Pair;
+
import static org.opends.messages.ReplicationMessages.*;
/**
@@ -96,7 +98,9 @@
public boolean update(DN baseDN, CSN csn)
{
if (csn == null)
+ {
return false;
+ }
ServerState serverState = list.get(baseDN);
if (serverState == null)
@@ -240,6 +244,45 @@
}
/**
+ * Returns the oldest Pair<DN, CSN> held in current object, excluding
+ * the provided CSNs. Said otherwise, the value returned is the oldest
+ * Pair<DN, CSN> included in the current object, that is not part of the
+ * excludedCSNs.
+ *
+ * @param excludedCSNs
+ * the CSNs that cannot be returned
+ * @return the oldest Pair<DN, CSN> included in the current object that
+ * is not part of the excludedCSNs, or {@link Pair#EMPTY} if no such
+ * older CSN exists.
+ */
+ public Pair<DN, CSN> getOldestCSNExcluding(MultiDomainServerState excludedCSNs)
+ {
+ Pair<DN, CSN> oldest = Pair.empty();
+ for (Entry<DN, ServerState> entry : list.entrySet())
+ {
+ final DN baseDN = entry.getKey();
+ final ServerState value = entry.getValue();
+ for (Entry<Integer, CSN> entry2 : value.getServerIdToCSNMap().entrySet())
+ {
+ final CSN csn = entry2.getValue();
+ if (!isReplicaExcluded(excludedCSNs, baseDN, csn)
+ && (oldest == Pair.EMPTY || csn.isOlderThan(oldest.getSecond())))
+ {
+ oldest = Pair.of(baseDN, csn);
+ }
+ }
+ }
+ return oldest;
+ }
+
+ private boolean isReplicaExcluded(MultiDomainServerState excluded, DN baseDN,
+ CSN csn)
+ {
+ return excluded != null
+ && csn.equals(excluded.getCSN(baseDN, csn.getServerId()));
+ }
+
+ /**
* Removes the mapping to the provided CSN if it is present in this
* MultiDomainServerState.
*
@@ -251,12 +294,8 @@
*/
public boolean removeCSN(DN baseDN, CSN expectedCSN)
{
- ServerState ss = list.get(baseDN);
- if (ss != null)
- {
- return ss.removeCSN(expectedCSN);
- }
- return false;
+ final ServerState ss = list.get(baseDN);
+ return ss != null && ss.removeCSN(expectedCSN);
}
/**
--
Gitblit v1.10.0