From 47ad5445b84bfedcf71353d2aebe46c65bd294a7 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 09 Oct 2013 11:12:19 +0000
Subject: [PATCH] OPENDJ-1116 Introduce abstraction for the changelog DB

---
 opends/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDB.java |   45 +++++++++++++++++++++++----------------------
 1 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDB.java b/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDB.java
index a6e9d17..d2d7795 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDB.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDB.java
@@ -74,15 +74,15 @@
 
   private DraftCNDB db;
   /**
-   * FIXME Is this field that useful? {@link #getFirstChangeNumber()} does not
+   * FIXME Is this field that useful? {@link #getOldestChangeNumber()} does not
    * even use it!
    */
-  private long firstChangeNumber = NO_KEY;
+  private volatile long oldestChangeNumber = NO_KEY;
   /**
-   * FIXME Is this field that useful? {@link #getLastChangeNumber()} does not
+   * FIXME Is this field that useful? {@link #getNewestChangeNumber()} does not
    * even use it!
    */
-  private long lastChangeNumber = NO_KEY;
+  private volatile long newestChangeNumber = NO_KEY;
   /** The last generated value for the change number. */
   private final AtomicLong lastGeneratedChangeNumber;
   private DbMonitorProvider dbMonitor = new DbMonitorProvider();
@@ -102,7 +102,7 @@
    * FIXME it never gets updated even when the replication server purge delay is
    * updated
    */
-  private long trimAge;
+  private volatile long trimAge;
 
   private ReplicationServer replicationServer;
 
@@ -123,14 +123,14 @@
 
     // DB initialization
     db = new DraftCNDB(dbenv);
-    final CNIndexRecord firstRecord = db.readFirstRecord();
-    final CNIndexRecord lastRecord = db.readLastRecord();
-    firstChangeNumber = getChangeNumber(firstRecord);
-    lastChangeNumber = getChangeNumber(lastRecord);
+    final CNIndexRecord oldestRecord = db.readFirstRecord();
+    final CNIndexRecord newestRecord = db.readLastRecord();
+    oldestChangeNumber = getChangeNumber(oldestRecord);
+    newestChangeNumber = getChangeNumber(newestRecord);
     // initialization of the lastGeneratedChangeNumber from the DB content
     // if DB is empty => last record does not exist => default to 0
-    lastGeneratedChangeNumber =
-        new AtomicLong((lastRecord != null) ? lastRecord.getChangeNumber() : 0);
+    long newestCN = (newestRecord != null) ? newestRecord.getChangeNumber() : 0;
+    lastGeneratedChangeNumber = new AtomicLong(newestCN);
 
     // Trimming thread
     thread =
@@ -168,14 +168,14 @@
 
   /** {@inheritDoc} */
   @Override
-  public CNIndexRecord getFirstRecord() throws ChangelogException
+  public CNIndexRecord getOldestRecord() throws ChangelogException
   {
     return db.readFirstRecord();
   }
 
   /** {@inheritDoc} */
   @Override
-  public CNIndexRecord getLastRecord() throws ChangelogException
+  public CNIndexRecord getNewestRecord() throws ChangelogException
   {
     return db.readLastRecord();
   }
@@ -211,7 +211,7 @@
    */
   public boolean isEmpty() throws ChangelogException
   {
-    return getLastRecord() == null;
+    return getNewestRecord() == null;
   }
 
   /**
@@ -375,12 +375,12 @@
             continue;
           }
 
+          // Purge up to wherever the other DBs have been purged to.
+          // FIXME there is an opportunity for a phantom record in the current
+          // DB if the replicaDB gets purged after the next if statement.
           final CSN csn = record.getCSN();
           final ServerState startState = domain.getStartState();
           final CSN fcsn = startState.getCSN(csn.getServerId());
-
-          final long currentChangeNumber = record.getChangeNumber();
-
           if (csn.isOlderThan(fcsn))
           {
             cursor.delete();
@@ -402,6 +402,7 @@
           catch(Exception e)
           {
             // We could not parse the MultiDomainServerState from the record
+            // FIXME this is quite an aggressive delete()
             cursor.delete();
             continue;
           }
@@ -417,7 +418,7 @@
             continue;
           }
 
-          firstChangeNumber = currentChangeNumber;
+          oldestChangeNumber = record.getChangeNumber();
           cursor.close();
           return;
         }
@@ -515,8 +516,8 @@
   @Override
   public String toString()
   {
-    return "JEChangeNumberIndexDB: " + firstChangeNumber + " "
-        + lastChangeNumber;
+    return getClass().getSimpleName() + ": " + oldestChangeNumber + " "
+        + newestChangeNumber;
   }
 
   /**
@@ -537,8 +538,8 @@
   public void clear() throws ChangelogException
   {
     db.clear();
-    firstChangeNumber = getChangeNumber(db.readFirstRecord());
-    lastChangeNumber = getChangeNumber(db.readLastRecord());
+    oldestChangeNumber = getChangeNumber(db.readFirstRecord());
+    newestChangeNumber = getChangeNumber(db.readLastRecord());
   }
 
   private ReentrantLock lock = new ReentrantLock();

--
Gitblit v1.10.0