From d356a45009acfa47a94f3d023ac38b4c1faadd13 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 17 Dec 2013 15:05:55 +0000
Subject: [PATCH] OPENDJ-1231 Make the Medium Consistency Point support replica heartbeats
---
opends/src/server/org/opends/server/replication/server/ReplicationServer.java | 130 +++++-------------------------------------
1 files changed, 17 insertions(+), 113 deletions(-)
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
index 0bc6ff5..dad53a1 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -1381,133 +1381,37 @@
/**
* Get the oldest and newest change numbers.
- * <p>
- * Implementation detail (but it could be more than a detail): The newest
- * change number seem to be a "potential" newest number. It adds up the
- * newesst change number to the number of changes coming from a domain's
- * ReplicaDBs.
*
- * @param endCSN
- * The CSN used as the upper limit when computing the newest change
- * number
- * @param excludedBaseDNs
- * The baseDNs that are excluded from the ECL.
* @return an array of size 2 holding the oldest and newest change numbers at
* indexes 0 and 1.
* @throws DirectoryException
* When it happens.
*/
- public long[] getECLChangeNumberLimits(CSN endCSN,
- Set<String> excludedBaseDNs) throws DirectoryException
+ public long[] getECLChangeNumberLimits() throws DirectoryException
{
- /* The content of the CNIndexDB depends on the SEARCH operations done before
- * requesting the change number. If no operations, CNIndexDB is empty.
- * The limits we want to get are the "potential" limits if a request was
- * done, the CNIndexDB is probably not complete to do that.
- *
- * The oldest change number is :
- * - the oldest record from the CNIndexDB
- * - if none because CNIndexDB empty,
- * then
- * if no change in replchangelog then return 0
- * else return 1 (change number that WILL be returned to next search)
- *
- * The newest change number is :
- * - initialized with the newest record from the CNIndexDB (0 if none)
- * and consider the genState associated
- * - to the newest change number, we add the count of updates in the
- * replchangelog FROM that genState TO the crossDomainEligibleCSN
- * (this diff is done domain by domain)
- */
try
{
final ChangeNumberIndexDB cnIndexDB = getChangeNumberIndexDB();
final ChangeNumberIndexRecord oldestRecord = cnIndexDB.getOldestRecord();
- final ChangeNumberIndexRecord newestRecord = cnIndexDB.getNewestRecord();
-
- boolean dbEmpty = true;
- long oldestChangeNumber = 0;
- long newestChangeNumber = 0;
- boolean noCookieForNewestCN = true;
- CSN csnForNewestCN = null;
- DN baseDNForNewestCN = null;
- if (oldestRecord != null)
+ if (oldestRecord == null)
{
- if (newestRecord == null)
- {
- // Edge case: DB was cleaned or closed in between calls to
- // getOldest*() and getNewest*().
- // The only remaining solution is to fail fast.
- throw new ChangelogException(
- ERR_READING_OLDEST_THEN_NEWEST_IN_CHANGENUMBER_DATABASE.get());
- }
-
- dbEmpty = false;
- oldestChangeNumber = oldestRecord.getChangeNumber();
- newestChangeNumber = newestRecord.getChangeNumber();
-
- // Get the generalized state associated with the current newest change
- // number and initializes from it the startStates table
- final String cookie = newestRecord.getPreviousCookie();
- noCookieForNewestCN = cookie == null || cookie.length() == 0;
-
- csnForNewestCN = newestRecord.getCSN();
- baseDNForNewestCN = newestRecord.getBaseDN();
- }
-
- long newestTime = csnForNewestCN != null ? csnForNewestCN.getTime() : 0;
- for (ReplicationServerDomain rsDomain : getReplicationServerDomains())
- {
- if (contains(
- excludedBaseDNs, rsDomain.getBaseDN().toNormalizedString()))
- continue;
-
- // for this domain, have the state in the replchangelog
- // where the newest change number update is
- long ec;
- if (noCookieForNewestCN)
- {
- // Count changes of this domain from the beginning of the changelog
- final ServerState startState = rsDomain.getOldestState()
- .duplicateOnlyOlderThan(rsDomain.getLatestDomainTrimDate());
- ec = rsDomain.getEligibleCount(startState, endCSN);
- }
- else
- {
- // There are records in the CNIndexDB (so already returned to clients)
- // BUT
- // There is nothing related to this domain in the newest record
- // (maybe this domain was disabled when this record was returned).
- // In that case, are counted the changes from the time of the most
- // recent change
-
- // And count changes of this domain from the date of the
- // newest seqnum record (that does not refer to this domain)
- CSN csnx = new CSN(newestTime, csnForNewestCN.getSeqnum(), 0);
- ec = rsDomain.getEligibleCount(csnx, endCSN);
-
- if (baseDNForNewestCN.equals(rsDomain.getBaseDN()))
- ec--;
- }
-
- // cumulates on domains
- newestChangeNumber += ec;
-
- // CNIndexDB is empty and there are eligible updates in the replication
- // changelog then init oldest change number
- if (ec > 0 && oldestChangeNumber == 0)
- oldestChangeNumber = 1;
- }
-
- if (dbEmpty)
- {
- // The database was empty, just keep increasing numbers since last time
+ // The database is empty, just keep increasing numbers since last time
// we generated one change number.
- long lastGeneratedCN = cnIndexDB.getLastGeneratedChangeNumber();
- oldestChangeNumber += lastGeneratedCN;
- newestChangeNumber += lastGeneratedCN;
+ final long lastGeneratedCN = cnIndexDB.getLastGeneratedChangeNumber();
+ return new long[] { lastGeneratedCN, lastGeneratedCN };
}
- return new long[] { oldestChangeNumber, newestChangeNumber };
+
+ final ChangeNumberIndexRecord newestRecord = cnIndexDB.getNewestRecord();
+ if (newestRecord == null)
+ {
+ // Edge case: DB was cleaned (or purged) in between calls to
+ // getOldest*() and getNewest*().
+ // The only remaining solution is to fail fast.
+ throw new DirectoryException(ResultCode.OPERATIONS_ERROR,
+ ERR_READING_OLDEST_THEN_NEWEST_IN_CHANGENUMBER_DATABASE.get());
+ }
+ return new long[] { oldestRecord.getChangeNumber(),
+ newestRecord.getChangeNumber() };
}
catch (ChangelogException e)
{
--
Gitblit v1.10.0