From bcd9325b7d47b6932d140a15ee761252e130ab7e Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 09 Oct 2013 13:35:05 +0000
Subject: [PATCH] OPENDJ-1116 Introduce abstraction for the changelog DB
---
opends/src/server/org/opends/server/replication/server/ReplicationServer.java | 86 +++++++++++++++---------------------------
1 files changed, 31 insertions(+), 55 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 c0fdf78..32c7017 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -1398,43 +1398,33 @@
*/
try
{
- boolean dbEmpty = true;
- long oldestChangeNumber = 0;
- long newestChangeNumber = 0;
-
final ChangeNumberIndexDB cnIndexDB = getChangeNumberIndexDB();
- final CNIndexRecord oldestCNRecord = cnIndexDB.getOldestRecord();
- final CNIndexRecord newestCNRecord = cnIndexDB.getNewestRecord();
-
- boolean noCookieForNewestCN = true;
- CSN csnForNewestCN = null;
- DN baseDNForNewestCN = null;
- if (oldestCNRecord != null)
+ final CNIndexRecord oldestRecord = cnIndexDB.getOldestRecord();
+ final CNIndexRecord newestRecord = cnIndexDB.getNewestRecord();
+ if (oldestRecord == null)
{
- if (newestCNRecord == 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 = oldestCNRecord.getChangeNumber();
- newestChangeNumber = newestCNRecord.getChangeNumber();
-
- // Get the generalized state associated with the current newest change
- // number and initializes from it the startStates table
- String newestCNGenState = newestCNRecord.getPreviousCookie();
- noCookieForNewestCN =
- newestCNGenState == null || newestCNGenState.length() == 0;
-
- csnForNewestCN = newestCNRecord.getCSN();
- baseDNForNewestCN = newestCNRecord.getBaseDN();
+ // 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());
}
- long newestDate = 0;
+ 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();
for (ReplicationServerDomain rsDomain : getReplicationServerDomains())
{
if (contains(
@@ -1447,30 +1437,25 @@
if (noCookieForNewestCN)
{
// Count changes of this domain from the beginning of the changelog
- CSN trimCSN = new CSN(rsDomain.getLatestDomainTrimDate(), 0, 0);
- ec = rsDomain.getEligibleCount(
- rsDomain.getStartState().duplicateOnlyOlderThan(trimCSN),
- maxOldestChangeNumber);
+ final ServerState startState = rsDomain.getOldestState()
+ .duplicateOnlyOlderThan(rsDomain.getLatestDomainTrimDate());
+ ec = rsDomain.getEligibleCount(startState, maxOldestChangeNumber);
}
else
{
// There are records in the CNIndexDB (so already returned to clients)
// BUT
// There is nothing related to this domain in the newest CNIndexRecord
- // (may be this domain was disabled when this record was returned).
- // In that case, are counted the changes from
- // the date of the most recent change from this newest CNIndexRecord
- if (newestDate == 0)
- {
- newestDate = csnForNewestCN.getTime();
- }
+ // (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(newestDate, csnForNewestCN.getSeqnum(), 0);
+ CSN csnx = new CSN(newestTime, newestRecord.getCSN().getSeqnum(), 0);
ec = rsDomain.getEligibleCount(csnx, maxOldestChangeNumber);
- if (baseDNForNewestCN.equals(rsDomain.getBaseDN()))
+ if (newestRecord.getBaseDN().equals(rsDomain.getBaseDN()))
ec--;
}
@@ -1482,15 +1467,6 @@
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