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