From 84cf626ebcae1b535abe9efd3eed5cdf78bdd319 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 05 Sep 2013 07:51:54 +0000
Subject: [PATCH] OPENDJ-1116 Introduce abstraction for the changelog DB
---
opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDB.java | 183 ++++++++++++---------------------------------
1 files changed, 49 insertions(+), 134 deletions(-)
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDB.java b/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDB.java
index e95fa04..7319e1e 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDB.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDB.java
@@ -34,7 +34,7 @@
import org.opends.messages.Message;
import org.opends.messages.MessageBuilder;
import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.replication.common.CSN;
+import org.opends.server.replication.server.changelog.api.CNIndexData;
import org.opends.server.replication.server.changelog.api.ChangelogException;
import org.opends.server.types.DebugLogLevel;
@@ -56,7 +56,6 @@
public class DraftCNDB
{
private static final DebugTracer TRACER = getTracer();
- private static final int DATABASE_EMPTY = 0;
private Database db;
private ReplicationDbEnv dbenv;
@@ -83,22 +82,19 @@
/**
* Add an entry to the database.
- * @param changeNumber the provided change number.
*
- * @param value the provided value to be stored associated
- * with this change number.
- * @param domainBaseDN the provided domainBaseDn to be stored associated
- * with this change number.
- * @param csn the provided replication CSN to be
- * stored associated with this change number.
+ * @param cnIndexData
+ * the provided {@link CNIndexData} to be stored.
*/
- public void addEntry(long changeNumber, String value, String domainBaseDN,
- CSN csn)
+ public void addEntry(CNIndexData cnIndexData)
{
try
{
+ final long changeNumber = cnIndexData.getChangeNumber();
DatabaseEntry key = new ReplicationDraftCNKey(changeNumber);
- DatabaseEntry data = new DraftCNData(value, domainBaseDN, csn);
+ DatabaseEntry data =
+ new DraftCNData(changeNumber, cnIndexData.getPreviousCookie(),
+ cnIndexData.getBaseDN(), cnIndexData.getCSN());
// Use a transaction so that we can override durability.
Transaction txn = null;
@@ -220,9 +216,12 @@
/**
* Read the first Change from the database, 0 when none.
+ *
* @return the first change number.
+ * @throws ChangelogException
+ * if a database problem occurred
*/
- public int readFirstChangeNumber()
+ public CNIndexData readFirstCNIndexData() throws ChangelogException
{
try
{
@@ -233,18 +232,18 @@
// If the DB has been closed then return immediately.
if (isDBClosed())
{
- return DATABASE_EMPTY;
+ return null;
}
cursor = db.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
+ ReplicationDraftCNKey key = new ReplicationDraftCNKey();
DatabaseEntry entry = new DatabaseEntry();
if (cursor.getFirst(key, entry, LockMode.DEFAULT) != SUCCESS)
{
- return DATABASE_EMPTY;
+ return null;
}
- return Integer.parseInt(decodeUTF8(key.getData()));
+ return newCNIndexData(key, entry);
}
finally
{
@@ -254,10 +253,17 @@
catch (DatabaseException e)
{
dbenv.shutdownOnException(e);
- return DATABASE_EMPTY;
+ return null;
}
}
+ private CNIndexData newCNIndexData(ReplicationDraftCNKey key,
+ DatabaseEntry data) throws ChangelogException
+ {
+ return new DraftCNData(key.getChangeNumber(), data.getData())
+ .getCNIndexData();
+ }
+
/**
* Return the record count.
* @return the record count.
@@ -270,7 +276,7 @@
// If the DB has been closed then return immediately.
if (isDBClosed())
{
- return DATABASE_EMPTY;
+ return 0;
}
return db.count();
@@ -283,14 +289,17 @@
{
dbCloseLock.readLock().unlock();
}
- return DATABASE_EMPTY;
+ return 0;
}
/**
* Read the last change number from the database.
+ *
* @return the last change number.
+ * @throws ChangelogException
+ * if a database problem occurred
*/
- public int readLastChangeNumber()
+ public CNIndexData readLastCNIndexData() throws ChangelogException
{
try
{
@@ -301,18 +310,18 @@
// If the DB has been closed then return immediately.
if (isDBClosed())
{
- return DATABASE_EMPTY;
+ return null;
}
cursor = db.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
+ ReplicationDraftCNKey key = new ReplicationDraftCNKey();
DatabaseEntry entry = new DatabaseEntry();
if (cursor.getLast(key, entry, LockMode.DEFAULT) != SUCCESS)
{
- return DATABASE_EMPTY;
+ return null;
}
- return Integer.parseInt(decodeUTF8(key.getData()));
+ return newCNIndexData(key, entry);
}
finally
{
@@ -322,7 +331,7 @@
catch (DatabaseException e)
{
dbenv.shutdownOnException(e);
- return DATABASE_EMPTY;
+ return null;
}
}
@@ -348,9 +357,9 @@
* Will be set non null for a write cursor.
*/
private final Transaction txn;
- private final DatabaseEntry key;
- private final DatabaseEntry entry;
- private DraftCNData cnData;
+ private final ReplicationDraftCNKey key;
+ private final DatabaseEntry entry = new DatabaseEntry();
+ private CNIndexData cnIndexData;
private boolean isClosed = false;
@@ -365,7 +374,6 @@
private DraftCNDBCursor(long startChangeNumber) throws ChangelogException
{
this.key = new ReplicationDraftCNKey(startChangeNumber);
- this.entry = new DatabaseEntry();
// Take the lock. From now on, whatever error that happen in the life
// of this cursor should end by unlocking that lock. We must also
@@ -405,12 +413,12 @@
}
else
{
- cnData = new DraftCNData(entry.getData());
+ cnIndexData = newCNIndexData(this.key, entry);
}
}
else
{
- cnData = new DraftCNData(entry.getData());
+ cnIndexData = newCNIndexData(this.key, entry);
}
}
@@ -431,15 +439,12 @@
}
}
-
-
private DraftCNDBCursor() throws ChangelogException
{
Transaction localTxn = null;
Cursor localCursor = null;
- this.key = new DatabaseEntry();
- this.entry = new DatabaseEntry();
+ this.key = new ReplicationDraftCNKey();
// We'll go on only if no close or no clear is running
dbCloseLock.readLock().lock();
@@ -544,105 +549,29 @@
}
/**
- * Getter for the value field of the current cursor.
- * @return The current value field.
- */
- public String currentValue()
- {
- if (isClosed)
- {
- return null;
- }
-
- try
- {
- if (cnData != null)
- {
- return cnData.getValue();
- }
- }
- catch(Exception e)
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- return null;
- }
-
- /**
- * Getter for the baseDN field of the current cursor.
- * @return The current baseDN.
- */
- public String currentBaseDN()
- {
- if (isClosed)
- {
- return null;
- }
-
- try
- {
- if (cnData != null)
- {
- return cnData.getBaseDN();
- }
- }
- catch(Exception e)
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- return null;
- }
-
- /**
- * Getter for the integer value of the current cursor, representing
- * the current change number being processed.
+ * Returns the {@link CNIndexData} at the current position of the cursor.
*
- * @return the current change number as an integer.
+ * @return The current {@link CNIndexData}.
*/
- public int currentKey()
+ public CNIndexData currentData()
{
if (isClosed)
{
- return -1;
+ return null;
}
try
{
- String str = decodeUTF8(key.getData());
- return Integer.parseInt(str);
+ return cnIndexData;
}
catch (Exception e)
{
TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- return -1;
- }
-
- /**
- * Returns the replication CSN associated with the current key.
- * @return the replication CSN
- */
- public CSN currentCSN()
- {
- if (isClosed)
- {
return null;
}
-
- try
- {
- if (cnData != null)
- {
- return cnData.getCSN();
- }
- }
- catch(Exception e)
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- return null;
}
+
/**
* Go to the next record on the cursor.
* @return the next record on this cursor.
@@ -659,10 +588,10 @@
OperationStatus status = cursor.getNext(key, entry, LockMode.DEFAULT);
if (status != OperationStatus.SUCCESS)
{
- cnData = null;
+ cnIndexData = null;
return false;
}
- cnData = new DraftCNData(entry.getData());
+ cnIndexData = newCNIndexData(this.key, entry);
}
catch(Exception e)
{
@@ -693,20 +622,6 @@
}
}
- /**
- * Returns the current key associated with this cursor.
- *
- * @return The current key associated with this cursor.
- */
- public DatabaseEntry getKey()
- {
- if (isClosed)
- {
- return null;
- }
-
- return key;
- }
}
/**
--
Gitblit v1.10.0