From 2fa7176ddfb52dd444a38421e5f4cf3e007deb81 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 09 Oct 2013 14:36:00 +0000
Subject: [PATCH] ReplicationServer.java: Partially reverted r9691 which was: "In getECLChangeNumberLimits(), brought the database empty code to the top of the method: to get something more readable." This code is more complex than I thought.
---
opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java | 63 ++++++++++++++++++++-----------
1 files changed, 40 insertions(+), 23 deletions(-)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
index 32c7017..260ec98 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -1401,30 +1401,38 @@
final ChangeNumberIndexDB cnIndexDB = getChangeNumberIndexDB();
final CNIndexRecord oldestRecord = cnIndexDB.getOldestRecord();
final CNIndexRecord newestRecord = cnIndexDB.getNewestRecord();
- if (oldestRecord == null)
+
+ boolean dbEmpty = true;
+ long oldestChangeNumber = 0;
+ long newestChangeNumber = 0;
+ boolean noCookieForNewestCN = true;
+ CSN csnForNewestCN = null;
+ DN baseDNForNewestCN = null;
+ if (oldestRecord != null)
{
- // The database is empty
- long lastGeneratedCN = cnIndexDB.getLastGeneratedChangeNumber();
- return new long[] { lastGeneratedCN, lastGeneratedCN };
- }
- if (newestRecord == null) // oldestCNRecord != 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());
+ 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 oldestChangeNumber = oldestRecord.getChangeNumber();
- long newestChangeNumber = newestRecord.getChangeNumber();
-
- // Get the generalized state associated with the current newest change
- // number and initializes from the startState table
- final String cookie = newestRecord.getPreviousCookie();
- boolean noCookieForNewestCN = cookie == null || cookie.length() == 0;
-
- long newestTime = newestRecord.getCSN().getTime();
+ long newestTime = csnForNewestCN != null ? csnForNewestCN.getTime() : 0;
for (ReplicationServerDomain rsDomain : getReplicationServerDomains())
{
if (contains(
@@ -1452,10 +1460,10 @@
// 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, newestRecord.getCSN().getSeqnum(), 0);
+ CSN csnx = new CSN(newestTime, csnForNewestCN.getSeqnum(), 0);
ec = rsDomain.getEligibleCount(csnx, maxOldestChangeNumber);
- if (newestRecord.getBaseDN().equals(rsDomain.getBaseDN()))
+ if (baseDNForNewestCN.equals(rsDomain.getBaseDN()))
ec--;
}
@@ -1467,6 +1475,15 @@
if (ec > 0 && oldestChangeNumber == 0)
oldestChangeNumber = 1;
}
+
+ if (dbEmpty)
+ {
+ // The database was empty, just keep increasing numbers since last time
+ // we generated one change number.
+ long lastGeneratedCN = cnIndexDB.getLastGeneratedChangeNumber();
+ oldestChangeNumber += lastGeneratedCN;
+ newestChangeNumber += lastGeneratedCN;
+ }
return new long[] { oldestChangeNumber, newestChangeNumber };
}
catch (ChangelogException e)
--
Gitblit v1.10.0