From a3782e7e00bbdeae37df8b8388fb6fecc17ede27 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 07 Aug 2013 11:03:39 +0000
Subject: [PATCH] ReplicationDbEnv.java: Extracted methods readDomainBaseDNGenerationIDRecords(), readServerIdDomainBaseDNRecords(), toInt(), toLong() and toString() from start(). Extracted method putInStateDBIfNotExist() from getOrAddDb(). Extracted method deleteFromStateDB() from clearGenerationId() and clearServerId().
---
opends/src/server/org/opends/server/replication/server/ReplicationDbEnv.java | 528 ++++++++++++++++++++++++++-------------------------------
1 files changed, 242 insertions(+), 286 deletions(-)
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationDbEnv.java b/opends/src/server/org/opends/server/replication/server/ReplicationDbEnv.java
index d063822..dc33cc8 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationDbEnv.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationDbEnv.java
@@ -26,24 +26,23 @@
* Portions Copyright 2011-2013 ForgeRock AS
*/
package org.opends.server.replication.server;
-import org.opends.messages.*;
-
-import static org.opends.server.loggers.ErrorLogger.logError;
-import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
-import static org.opends.server.loggers.debug.DebugLogger.getTracer;
-import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.types.DebugLogLevel;
import static org.opends.messages.ReplicationMessages.*;
-import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
+import static org.opends.server.loggers.ErrorLogger.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
+import static org.opends.server.util.StaticUtils.*;
import java.io.File;
import java.io.UnsupportedEncodingException;
+import java.util.concurrent.TimeUnit;
+
+import org.opends.messages.Message;
+import org.opends.messages.MessageBuilder;
+import org.opends.server.loggers.debug.DebugTracer;
+import org.opends.server.types.DebugLogLevel;
import com.sleepycat.je.*;
-import java.util.concurrent.TimeUnit;
-
/**
* This class is used to represent a Db environment that can be used
* to create ReplicationDB.
@@ -164,122 +163,8 @@
try
{
- /*
- * Get the domain base DN/ generationIDs records
- */
- OperationStatus status = cursor.getFirst(key, data, LockMode.DEFAULT);
- while (status == OperationStatus.SUCCESS)
- {
- try
- {
- String stringData = new String(data.getData(), "UTF-8");
-
- if (debugEnabled())
- TRACER.debugInfo(
- "In " + this.replicationServer.getMonitorInstanceName() +
- " Read tag baseDn generationId=" + stringData);
-
- String[] str = stringData.split(FIELD_SEPARATOR, 3);
- if (str[0].equals(GENERATION_ID_TAG))
- {
- long generationId;
- try
- {
- // <generationId>
- generationId = new Long(str[1]);
- }
- catch (NumberFormatException e)
- {
- // should never happen
- // TODO: i18n
- throw new ReplicationDBException(Message.raw(
- "replicationServer state database has a wrong format: " +
- e.getLocalizedMessage()
- + "<" + str[1] + ">"));
- }
-
- String baseDn = str[2];
-
- if (debugEnabled())
- TRACER.debugInfo(
- "In " + this.replicationServer.getMonitorInstanceName() +
- " Has read baseDn=" + baseDn
- + " generationId=" + generationId);
-
- replicationServer.getReplicationServerDomain(baseDn, true).
- initGenerationID(generationId);
- }
- }
- catch (UnsupportedEncodingException e)
- {
- // should never happens
- // TODO: i18n
- throw new ReplicationDBException(Message.raw("need UTF-8 support"));
- }
- status = cursor.getNext(key, data, LockMode.DEFAULT);
- }
-
- /*
- * Get the server Id / domain base DN records
- */
- status = cursor.getFirst(key, data, LockMode.DEFAULT);
- while (status == OperationStatus.SUCCESS)
- {
- String stringData;
- try
- {
- stringData = new String(data.getData(), "UTF-8");
- }
- catch (UnsupportedEncodingException e)
- {
- // should never happens
- // TODO: i18n
- throw new ReplicationDBException(Message.raw(
- "need UTF-8 support"));
- }
-
- if (debugEnabled())
- TRACER.debugInfo(
- "In " + this.replicationServer.getMonitorInstanceName() +
- " Read serverId BaseDN=" + stringData);
-
- String[] str = stringData.split(FIELD_SEPARATOR, 2);
- if (!str[0].equals(GENERATION_ID_TAG))
- {
- int serverId;
- try
- {
- // <serverId>
- serverId = new Integer(str[0]);
- } catch (NumberFormatException e)
- {
- // should never happen
- // TODO: i18n
- throw new ReplicationDBException(Message.raw(
- "replicationServer state database has a wrong format: " +
- e.getLocalizedMessage()
- + "<" + str[0] + ">"));
- }
- // <baseDn>
- String baseDn = str[1];
-
- if (debugEnabled())
- TRACER.debugInfo(
- "In " + this.replicationServer.getMonitorInstanceName() +
- " Has read: baseDn=" + baseDn
- + " serverId=" + serverId);
-
- DbHandler dbHandler =
- new DbHandler(
- serverId, baseDn, replicationServer, this,
- replicationServer.getQueueSize());
-
- replicationServer.getReplicationServerDomain(baseDn, true).
- setDbHandler(serverId, dbHandler);
- }
-
- status = cursor.getNext(key, data, LockMode.DEFAULT);
- }
+ readDomainBaseDNGenerationIDRecords(key, data, cursor);
+ readServerIdDomainBaseDNRecords(key, data, cursor);
}
finally
{
@@ -294,6 +179,124 @@
}
}
+ private void readDomainBaseDNGenerationIDRecords(DatabaseEntry key,
+ DatabaseEntry data, Cursor cursor) throws ReplicationDBException
+ {
+ /*
+ * Get the domain base DN/ generationIDs records
+ */
+ OperationStatus status = cursor.getFirst(key, data, LockMode.DEFAULT);
+ while (status == OperationStatus.SUCCESS)
+ {
+ String stringData = toString(data.getData());
+
+ if (debugEnabled())
+ TRACER.debugInfo("In "
+ + this.replicationServer.getMonitorInstanceName()
+ + " Read tag baseDn generationId=" + stringData);
+
+ String[] str = stringData.split(FIELD_SEPARATOR, 3);
+ if (str[0].equals(GENERATION_ID_TAG))
+ {
+ long generationId = toLong(str[1]);
+ String baseDn = str[2];
+
+ if (debugEnabled())
+ TRACER.debugInfo("In "
+ + this.replicationServer.getMonitorInstanceName()
+ + " Has read baseDn=" + baseDn + " generationId=" + generationId);
+
+ replicationServer.getReplicationServerDomain(baseDn, true)
+ .initGenerationID(generationId);
+ }
+ status = cursor.getNext(key, data, LockMode.DEFAULT);
+ }
+ }
+
+ private void readServerIdDomainBaseDNRecords(DatabaseEntry key,
+ DatabaseEntry data, Cursor cursor) throws ReplicationDBException
+ {
+ /*
+ * Get the server Id / domain base DN records
+ */
+ OperationStatus status = cursor.getFirst(key, data, LockMode.DEFAULT);
+ while (status == OperationStatus.SUCCESS)
+ {
+ String stringData = toString(data.getData());
+
+ if (debugEnabled())
+ TRACER.debugInfo("In "
+ + this.replicationServer.getMonitorInstanceName()
+ + " Read serverId BaseDN=" + stringData);
+
+ String[] str = stringData.split(FIELD_SEPARATOR, 2);
+ if (!str[0].equals(GENERATION_ID_TAG))
+ {
+ int serverId = toInt(str[0]);
+ String baseDn = str[1];
+
+ if (debugEnabled())
+ TRACER.debugInfo("In "
+ + this.replicationServer.getMonitorInstanceName()
+ + " Has read: baseDn=" + baseDn + " serverId=" + serverId);
+
+ DbHandler dbHandler =
+ new DbHandler(serverId, baseDn, replicationServer, this,
+ replicationServer.getQueueSize());
+
+ replicationServer.getReplicationServerDomain(baseDn, true)
+ .setDbHandler(serverId, dbHandler);
+ }
+
+ status = cursor.getNext(key, data, LockMode.DEFAULT);
+ }
+ }
+
+ private int toInt(String data) throws ReplicationDBException
+ {
+ try
+ {
+ return Integer.parseInt(data);
+ } catch (NumberFormatException e)
+ {
+ // should never happen
+ // TODO: i18n
+ throw new ReplicationDBException(Message
+ .raw("replicationServer state database has a wrong format: "
+ + e.getLocalizedMessage() + "<" + data + ">"));
+ }
+ }
+
+ private long toLong(String data) throws ReplicationDBException
+ {
+ try
+ {
+ return Long.parseLong(data);
+ }
+ catch (NumberFormatException e)
+ {
+ // should never happen
+ // TODO: i18n
+ throw new ReplicationDBException(Message
+ .raw("replicationServer state database has a wrong format: "
+ + e.getLocalizedMessage() + "<" + data + ">"));
+ }
+ }
+
+ private String toString(byte[] data) throws ReplicationDBException
+ {
+ try
+ {
+ return new String(data, "UTF-8");
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ // should never happens
+ // TODO: i18n
+ throw new ReplicationDBException(Message.raw("need UTF-8 support"));
+ }
+ }
+
/**
* Finds or creates the database used to store changes from the server
* with the given serverId and the given baseDn.
@@ -304,7 +307,7 @@
* @return the Database.
* @throws DatabaseException in case of underlying Exception.
*/
- public Database getOrAddDb(int serverId, String baseDn, Long generationId)
+ public Database getOrAddDb(int serverId, String baseDn, long generationId)
throws DatabaseException
{
if (debugEnabled())
@@ -312,71 +315,25 @@
serverId + " " + baseDn + " " + generationId);
try
{
- String stringId = serverId + FIELD_SEPARATOR + baseDn;
+ String key = serverId + FIELD_SEPARATOR + baseDn;
// Opens the database for the changes received from this server
// on this domain. Create it if it does not already exist.
DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setAllowCreate(true);
dbConfig.setTransactional(true);
- Database db = dbEnvironment.openDatabase(null, stringId, dbConfig);
+ Database db = dbEnvironment.openDatabase(null, key, dbConfig);
// Creates the record serverId/domain base Dn in the stateDb
// if it does not already exist.
- byte[] byteId;
- byteId = stringId.getBytes("UTF-8");
- DatabaseEntry key = new DatabaseEntry();
- key.setData(byteId);
- DatabaseEntry data = new DatabaseEntry();
- OperationStatus status = stateDb.get(null, key, data, LockMode.DEFAULT);
- if (status == OperationStatus.NOTFOUND)
- {
- Transaction txn = dbEnvironment.beginTransaction(null, null);
- try {
- data.setData(byteId);
- if (debugEnabled())
- TRACER.debugInfo("getOrAddDb() Created in the state Db record " +
- " serverId/Domain=<"+stringId+">");
- stateDb.put(txn, key, data);
- txn.commit(Durability.COMMIT_WRITE_NO_SYNC);
- } catch (DatabaseException dbe)
- {
- // Abort the txn and propagate the Exception to the caller
- txn.abort();
- throw dbe;
- }
- }
+ putInStateDBIfNotExist(key, key);
// Creates the record domain base Dn/ generationId in the stateDb
// if it does not already exist.
- stringId = GENERATION_ID_TAG + FIELD_SEPARATOR + baseDn;
- String dataStringId = GENERATION_ID_TAG + FIELD_SEPARATOR +
- generationId.toString() + FIELD_SEPARATOR + baseDn;
- byteId = stringId.getBytes("UTF-8");
- byte[] dataByteId;
- dataByteId = dataStringId.getBytes("UTF-8");
- key = new DatabaseEntry();
- key.setData(byteId);
- data = new DatabaseEntry();
- status = stateDb.get(null, key, data, LockMode.DEFAULT);
- if (status == OperationStatus.NOTFOUND)
- {
- Transaction txn = dbEnvironment.beginTransaction(null, null);
- try {
- data.setData(dataByteId);
- if (debugEnabled())
- TRACER.debugInfo(
- "Created in the state Db record Tag/Domain/GenId key=" +
- stringId + " value=" + dataStringId);
- stateDb.put(txn, key, data);
- txn.commit(Durability.COMMIT_WRITE_NO_SYNC);
- } catch (DatabaseException dbe)
- {
- // Abort the txn and propagate the Exception to the caller
- txn.abort();
- throw dbe;
- }
- }
+ key = GENERATION_ID_TAG + FIELD_SEPARATOR + baseDn;
+ String data = GENERATION_ID_TAG + FIELD_SEPARATOR + generationId
+ + FIELD_SEPARATOR + baseDn;
+ putInStateDBIfNotExist(key, data);
return db;
}
catch (UnsupportedEncodingException e)
@@ -386,6 +343,36 @@
}
}
+ private void putInStateDBIfNotExist(String keyString, String dataString)
+ throws UnsupportedEncodingException
+ {
+ byte[] byteId = keyString.getBytes("UTF-8");
+ byte[] dataByteId = dataString.getBytes("UTF-8");
+ DatabaseEntry key = new DatabaseEntry();
+ key.setData(byteId);
+ DatabaseEntry data = new DatabaseEntry();
+ OperationStatus status = stateDb.get(null, key, data, LockMode.DEFAULT);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ Transaction txn = dbEnvironment.beginTransaction(null, null);
+ try
+ {
+ data.setData(dataByteId);
+ if (debugEnabled())
+ TRACER.debugInfo("Created in the state Db record key=[" + keyString
+ + "] value=[" + dataString + "]");
+ stateDb.put(txn, key, data);
+ txn.commit(Durability.COMMIT_WRITE_NO_SYNC);
+ }
+ catch (DatabaseException dbe)
+ {
+ // Abort the txn and propagate the Exception to the caller
+ txn.abort();
+ throw dbe;
+ }
+ }
+ }
+
/**
* Creates a new transaction.
*
@@ -425,122 +412,91 @@
}
}
- /**
- * Clears the provided generationId associated to the provided baseDn
- * from the state Db.
- *
- * @param baseDn The baseDn for which the generationID must be cleared.
- *
- */
- public void clearGenerationId(String baseDn)
+ /**
+ * Clears the provided generationId associated to the provided baseDn from the
+ * state Db.
+ *
+ * @param baseDn
+ * The baseDn for which the generationID must be cleared.
+ */
+ public void clearGenerationId(String baseDn)
+ {
+ String methodInvocation = "clearGenerationId(baseDN=" + baseDn + ")";
+
+ String key = GENERATION_ID_TAG + FIELD_SEPARATOR + baseDn;
+ OperationStatus status = deleteFromStateDB(key, methodInvocation);
+ if (status == OperationStatus.SUCCESS || status == OperationStatus.KEYEXIST)
{
+ // TODO : should have a better error logging
if (debugEnabled())
- TRACER.debugInfo(
- "In " + this.replicationServer.getMonitorInstanceName() +
- " clearGenerationId " + baseDn);
- try
+ TRACER.debugInfo("In "
+ + this.replicationServer.getMonitorInstanceName()
+ + methodInvocation + " failed " + status);
+ }
+ }
+
+ /**
+ * Clears the provided serverId associated to the provided baseDn from the
+ * state Db.
+ *
+ * @param baseDn
+ * The baseDn for which the generationID must be cleared.
+ * @param serverId
+ * The serverId to remove from the Db.
+ */
+ public void clearServerId(String baseDn, int serverId)
+ {
+ String key = serverId + FIELD_SEPARATOR + baseDn;
+ deleteFromStateDB(key, "clearServerId(baseDN=" + baseDn + " , serverId="
+ + serverId + ")");
+ }
+
+ private OperationStatus deleteFromStateDB(String keyString,
+ String methodInvocation)
+ {
+ if (debugEnabled())
+ TRACER.debugInfo("In " + this.replicationServer.getMonitorInstanceName()
+ + " " + methodInvocation);
+
+ try
+ {
+ final byte[] byteId = keyString.getBytes("UTF-8");
+ final DatabaseEntry key = new DatabaseEntry();
+ key.setData(byteId);
+ final DatabaseEntry data = new DatabaseEntry();
+ OperationStatus status = stateDb.get(null, key, data, LockMode.DEFAULT);
+ if (status != OperationStatus.NOTFOUND)
{
- // Deletes the record domain base Dn/ generationId in the stateDb
- String stringId = GENERATION_ID_TAG + FIELD_SEPARATOR + baseDn;
- byte[] byteId = stringId.getBytes("UTF-8");
- DatabaseEntry key = new DatabaseEntry();
- key.setData(byteId);
- DatabaseEntry data = new DatabaseEntry();
- OperationStatus status = stateDb.get(null, key, data, LockMode.DEFAULT);
- if ((status == OperationStatus.SUCCESS) ||
- (status == OperationStatus.KEYEXIST))
+ Transaction txn = dbEnvironment.beginTransaction(null, null);
+ try
{
- Transaction txn = dbEnvironment.beginTransaction(null, null);
- try
- {
- stateDb.delete(txn, key);
- txn.commit(Durability.COMMIT_WRITE_NO_SYNC);
- if (debugEnabled())
- TRACER.debugInfo(
- "In " + this.replicationServer.getMonitorInstanceName() +
- " clearGenerationId (" + baseDn +") succeeded.");
- }
- catch (DatabaseException dbe)
- {
- // Abort the txn and propagate the Exception to the caller
- txn.abort();
- throw dbe;
- }
- }
- else
- {
- // TODO : should have a better error logging
+ stateDb.delete(txn, key);
+ txn.commit(Durability.COMMIT_WRITE_NO_SYNC);
if (debugEnabled())
- TRACER.debugInfo(
- "In " + this.replicationServer.getMonitorInstanceName() +
- " clearGenerationId ("+ baseDn + " failed" + status.toString());
+ TRACER.debugInfo(" In "
+ + this.replicationServer.getMonitorInstanceName() + " "
+ + methodInvocation + " succeeded " + status);
}
- }
- catch (UnsupportedEncodingException e)
- {
- // can't happen
- }
- catch (DatabaseException dbe)
- {
- // can't happen
- }
- }
-
- /**
- * Clears the provided serverId associated to the provided baseDn
- * from the state Db.
- *
- * @param baseDn The baseDn for which the generationID must be cleared.
- * @param serverId The serverId to remove from the Db.
- *
- */
- public void clearServerId(String baseDn, int serverId)
- {
- if (debugEnabled())
- TRACER.debugInfo(
- "In " + this.replicationServer.getMonitorInstanceName() +
- "clearServerId(baseDN=" + baseDn + ", serverId=" + serverId);
- try
- {
- String stringId = serverId + FIELD_SEPARATOR + baseDn;
-
- // Deletes the record serverId/domain base Dn in the stateDb
- byte[] byteId;
- byteId = stringId.getBytes("UTF-8");
- DatabaseEntry key = new DatabaseEntry();
- key.setData(byteId);
- DatabaseEntry data = new DatabaseEntry();
- OperationStatus status = stateDb.get(null, key, data, LockMode.DEFAULT);
- if (status != OperationStatus.NOTFOUND)
+ catch (DatabaseException dbe)
{
- Transaction txn = dbEnvironment.beginTransaction(null, null);
- try {
- data.setData(byteId);
- stateDb.delete(txn, key);
- txn.commit(Durability.COMMIT_WRITE_NO_SYNC);
- if (debugEnabled())
- TRACER.debugInfo(
- " In " + this.replicationServer.getMonitorInstanceName() +
- " clearServerId() succeeded " + baseDn + " " +
- serverId);
- }
- catch (DatabaseException dbe)
- {
- // Abort the txn and propagate the Exception to the caller
- txn.abort();
- throw dbe;
- }
+ // Abort the txn and propagate the Exception to the caller
+ txn.abort();
+ throw dbe;
}
}
- catch (UnsupportedEncodingException e)
- {
- // can't happen
- }
- catch (DatabaseException dbe)
- {
- // can't happen
- }
+ return status;
}
+ catch (UnsupportedEncodingException e)
+ {
+ // can't happen
+ }
+ catch (DatabaseException dbe)
+ {
+ // FIXME can actually happen (see catch above)
+ // what should we do about it?
+ }
+ return null;
+ }
/**
* Clears the database.
--
Gitblit v1.10.0