From 46d24bb8c5cc2cffeae1044eaa034882550d77db 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

---
 opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangelogDB.java |  106 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 100 insertions(+), 6 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangelogDB.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangelogDB.java
index a401c83..82c846e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangelogDB.java
+++ b/opendj-sdk/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