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