From cc21522ea71015c75a82ebf285644fa5ff57f46a Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 30 Sep 2013 15:30:32 +0000
Subject: [PATCH] OPENDJ-1116 Introduce abstraction for the changelog DB

---
 opends/src/server/org/opends/server/replication/server/ReplicationServer.java          |  113 +---------------------
 opends/src/server/org/opends/server/replication/server/changelog/je/JEChangelogDB.java |  106 ++++++++++++++++++++-
 opends/src/server/org/opends/server/replication/server/changelog/api/ChangelogDB.java  |   13 +-
 opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java    |   11 --
 4 files changed, 113 insertions(+), 130 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 4cc7ad4..ead8133 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -65,7 +65,6 @@
 import static org.opends.messages.ReplicationMessages.*;
 import static org.opends.server.loggers.ErrorLogger.*;
 import static org.opends.server.loggers.debug.DebugLogger.*;
-import static org.opends.server.types.ResultCode.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
 
@@ -143,17 +142,6 @@
   private long monitoringPublisherPeriod = 3000;
 
   /**
-   * The handler of the changelog database, the database stores the relation
-   * between a change number and the associated cookie.
-   * <p>
-   * Guarded by cnIndexDBLock
-   */
-  private ChangeNumberIndexDB cnIndexDB;
-
-  /** Used for protecting {@link ChangeNumberIndexDB} related state. */
-  private final Object cnIndexDBLock = new Object();
-
-  /**
    * The tracer object for the debug logger.
    */
   private static final DebugTracer TRACER = getTracer();
@@ -645,29 +633,6 @@
       DirectoryServer.deregisterWorkflowElement(eclwe);
       eclwe.finalizeWorkflowElement();
     }
-
-    shutdownCNIndexDB();
-  }
-
-  private void shutdownCNIndexDB()
-  {
-    synchronized (cnIndexDBLock)
-    {
-      if (cnIndexDB != null)
-      {
-        try
-        {
-          cnIndexDB.shutdown();
-        }
-        catch (ChangelogException ignored)
-        {
-          if (debugEnabled())
-          {
-            TRACER.debugCaught(DebugLogLevel.WARNING, ignored);
-          }
-        }
-      }
-    }
   }
 
   /**
@@ -802,34 +767,6 @@
   }
 
   /**
-   * Clears the generationId for the replicationServerDomain related to the
-   * provided baseDN.
-   *
-   * @param baseDN
-   *          The baseDN for which to delete the generationId.
-   */
-  public void clearGenerationId(DN baseDN)
-  {
-    synchronized (cnIndexDBLock)
-    {
-      if (cnIndexDB != null)
-      {
-        try
-        {
-          cnIndexDB.clear(baseDN);
-        }
-        catch (Exception ignored)
-        {
-          if (debugEnabled())
-          {
-            TRACER.debugCaught(DebugLogLevel.WARNING, ignored);
-          }
-        }
-      }
-    }
-  }
-
-  /**
    * Retrieves the time after which changes must be deleted from the
    * persistent storage (in milliseconds).
    *
@@ -1282,27 +1219,7 @@
       rsd.clearDbs();
     }
 
-    synchronized (cnIndexDBLock)
-    {
-      if (cnIndexDB != null)
-      {
-        try
-        {
-          cnIndexDB.clear();
-        }
-        catch (Exception ignored)
-        {
-          if (debugEnabled())
-          {
-            TRACER.debugCaught(DebugLogLevel.WARNING, ignored);
-          }
-        }
-
-        shutdownCNIndexDB();
-
-        cnIndexDB = null;
-      }
-    }
+    this.changelogDB.clearCNIndexDB();
   }
 
   /**
@@ -1508,29 +1425,10 @@
    * changelog.
    *
    * @return the handler.
-   * @throws DirectoryException
-   *           when needed.
    */
-  ChangeNumberIndexDB getChangeNumberIndexDB() throws DirectoryException
+  ChangeNumberIndexDB getChangeNumberIndexDB()
   {
-    synchronized (cnIndexDBLock)
-    {
-      try
-      {
-        if (cnIndexDB == null)
-        {
-          cnIndexDB = this.changelogDB.newChangeNumberIndexDB();
-        }
-        return cnIndexDB;
-      }
-      catch (Exception e)
-      {
-        TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        Message message =
-            ERR_CHANGENUMBER_DATABASE.get(e.getLocalizedMessage());
-        throw new DirectoryException(OPERATIONS_ERROR, message, e);
-      }
-    }
+    return this.changelogDB.getChangeNumberIndexDB();
   }
 
   /**
@@ -1567,14 +1465,13 @@
      *     replchangelog FROM that genState TO the crossDomainEligibleCSN
      *     (this diff is done domain by domain)
      */
-
-    final ChangeNumberIndexDB cnIndexDB = getChangeNumberIndexDB();
     try
     {
       boolean dbEmpty = true;
       long firstChangeNumber = 0;
       long lastChangeNumber = 0;
 
+      final ChangeNumberIndexDB cnIndexDB = getChangeNumberIndexDB();
       final CNIndexRecord firstCNRecord = cnIndexDB.getFirstRecord();
       final CNIndexRecord lastCNRecord = cnIndexDB.getLastRecord();
 
@@ -1657,7 +1554,7 @@
       {
         // The database was empty, just keep increasing numbers since last time
         // we generated one change number.
-        long lastGeneratedCN = this.cnIndexDB.getLastGeneratedChangeNumber();
+        long lastGeneratedCN = cnIndexDB.getLastGeneratedChangeNumber();
         firstChangeNumber += lastGeneratedCN;
         lastChangeNumber += lastGeneratedCN;
       }
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java b/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
index fe0622a..66d17ef 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
@@ -2202,18 +2202,7 @@
    */
   public void clearDbs()
   {
-    // Reset the localchange and state db for the current domain
     changelogDB.removeDomain(baseDN);
-    try
-    {
-      localReplicationServer.clearGenerationId(baseDN);
-    }
-    catch (Exception e)
-    {
-      // TODO: i18n
-      logError(Message.raw("Exception caught while clearing generationId:"
-          + e.getLocalizedMessage()));
-    }
   }
 
   /**
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/api/ChangelogDB.java b/opends/src/server/org/opends/server/replication/server/changelog/api/ChangelogDB.java
index 28ee57e..b96492a 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/api/ChangelogDB.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/api/ChangelogDB.java
@@ -84,18 +84,21 @@
   void shutdownDB();
 
   /**
+   * Temporary method added here until I (JNR) can find a way to get rid of it.
+   */
+  void clearCNIndexDB();
+
+  /**
    * Removes the changelog database directory.
    */
   void removeDB();
 
   /**
-   * Returns a new {@link ChangeNumberIndexDB} object.
+   * Returns the {@link ChangeNumberIndexDB} object.
    *
-   * @return a new {@link ChangeNumberIndexDB} object
-   * @throws ChangelogException
-   *           If a database problem happened
+   * @return the {@link ChangeNumberIndexDB} object
    */
-  ChangeNumberIndexDB newChangeNumberIndexDB() throws ChangelogException;
+  ChangeNumberIndexDB getChangeNumberIndexDB();
 
   // Domain methods
 
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangelogDB.java b/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangelogDB.java
index a401c83..82c846e 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangelogDB.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangelogDB.java
@@ -70,6 +70,17 @@
   private final String dbDirectoryName;
   private final File dbDirectory;
 
+  /**
+   * The handler of the changelog database, the database stores the relation
+   * between a change number and the associated cookie.
+   * <p>
+   * Guarded by cnIndexDBLock
+   */
+  private ChangeNumberIndexDB cnIndexDB;
+
+  /** Used for protecting {@link ChangeNumberIndexDB} related state. */
+  private final Object cnIndexDBLock = new Object();
+
   /** The local replication server. */
   private final ReplicationServer replicationServer;
 
@@ -229,10 +240,8 @@
     }
     catch (ChangelogException e)
     {
-      Message message =
-          ERR_COULD_NOT_READ_DB.get(this.dbDirectory.getAbsolutePath(), e
-              .getLocalizedMessage());
-      logError(message);
+      logError(ERR_COULD_NOT_READ_DB.get(this.dbDirectory.getAbsolutePath(),
+          e.getLocalizedMessage()));
     }
   }
 
@@ -255,10 +264,33 @@
     }
   }
 
+  private void shutdownCNIndexDB()
+  {
+    synchronized (cnIndexDBLock)
+    {
+      if (cnIndexDB != null)
+      {
+        try
+        {
+          cnIndexDB.shutdown();
+        }
+        catch (ChangelogException ignored)
+        {
+          if (debugEnabled())
+          {
+            TRACER.debugCaught(DebugLogLevel.WARNING, ignored);
+          }
+        }
+      }
+    }
+  }
+
   /** {@inheritDoc} */
   @Override
   public void shutdownDB()
   {
+    shutdownCNIndexDB();
+
     if (dbEnv != null)
     {
       dbEnv.shutdown();
@@ -267,6 +299,33 @@
 
   /** {@inheritDoc} */
   @Override
+  public void clearCNIndexDB()
+  {
+    synchronized (cnIndexDBLock)
+    {
+      if (cnIndexDB != null)
+      {
+        try
+        {
+          cnIndexDB.clear();
+        }
+        catch (Exception ignored)
+        {
+          if (debugEnabled())
+          {
+            TRACER.debugCaught(DebugLogLevel.WARNING, ignored);
+          }
+        }
+
+        shutdownCNIndexDB();
+
+        cnIndexDB = null;
+      }
+    }
+  }
+
+  /** {@inheritDoc} */
+  @Override
   public void removeDB()
   {
     StaticUtils.recursiveDelete(dbDirectory);
@@ -354,6 +413,7 @@
   @Override
   public void removeDomain(DN baseDN)
   {
+    // 1- clear the replica DBs
     final Map<Integer, DbHandler> domainMap = getDomainMap(baseDN);
     synchronized (domainMap)
     {
@@ -376,6 +436,26 @@
       shutdownDbHandlers(domainMap);
     }
 
+    // 2- clear the ChangeNumber index DB
+    synchronized (cnIndexDBLock)
+    {
+      if (cnIndexDB != null)
+      {
+        try
+        {
+          cnIndexDB.clear(baseDN);
+        }
+        catch (Exception ignored)
+        {
+          if (debugEnabled())
+          {
+            TRACER.debugCaught(DebugLogLevel.WARNING, ignored);
+          }
+        }
+      }
+    }
+
+    // 3- clear the changelogstate DB
     try
     {
       dbEnv.clearGenerationId(baseDN);
@@ -446,9 +526,23 @@
 
   /** {@inheritDoc} */
   @Override
-  public ChangeNumberIndexDB newChangeNumberIndexDB() throws ChangelogException
+  public ChangeNumberIndexDB getChangeNumberIndexDB()
   {
-    return new DraftCNDbHandler(replicationServer, this.dbEnv);
+    synchronized (cnIndexDBLock)
+    {
+      if (cnIndexDB == null)
+      {
+        try
+        {
+          cnIndexDB = new DraftCNDbHandler(replicationServer, this.dbEnv);
+        }
+        catch (Exception e)
+        {
+          logError(ERR_CHANGENUMBER_DATABASE.get(e.getLocalizedMessage()));
+        }
+      }
+      return cnIndexDB;
+    }
   }
 
   /** {@inheritDoc} */

--
Gitblit v1.10.0