From 55e5dd13a9d3d646a3a426cf4f0790f0cded735e Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 30 Sep 2013 14:48:34 +0000
Subject: [PATCH] OPENDJ-1116 Introduce abstraction for the changelog DB
---
opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandler.java | 68 ++++++++++++++++++++++-----------
1 files changed, 45 insertions(+), 23 deletions(-)
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandler.java b/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandler.java
index 3462514..cb7851a 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/DraftCNDbHandler.java
@@ -30,6 +30,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReentrantLock;
import org.opends.messages.MessageBuilder;
@@ -82,6 +83,8 @@
* even use it!
*/
private long lastChangeNumber = NO_KEY;
+ /** The last generated value for the change number. */
+ private final AtomicLong lastGeneratedChangeNumber;
private DbMonitorProvider dbMonitor = new DbMonitorProvider();
private boolean shutdown = false;
private boolean trimDone = false;
@@ -120,8 +123,14 @@
// DB initialization
db = new DraftCNDB(dbenv);
- firstChangeNumber = getChangeNumber(db.readFirstRecord());
- lastChangeNumber = getChangeNumber(db.readLastRecord());
+ final CNIndexRecord firstRecord = db.readFirstRecord();
+ final CNIndexRecord lastRecord = db.readLastRecord();
+ firstChangeNumber = getChangeNumber(firstRecord);
+ lastChangeNumber = getChangeNumber(lastRecord);
+ // initialization of the lastGeneratedChangeNumber from the DB content
+ // if DB is empty => last record does not exist => default to 0
+ lastGeneratedChangeNumber =
+ new AtomicLong((lastRecord != null) ? lastRecord.getChangeNumber() : 0);
// Trimming thread
thread = new DirectoryThread(this, "Replication DraftCN db");
@@ -165,6 +174,20 @@
return db.readLastRecord();
}
+ /** {@inheritDoc} */
+ @Override
+ public long nextChangeNumber()
+ {
+ return lastGeneratedChangeNumber.incrementAndGet();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public long getLastGeneratedChangeNumber()
+ {
+ return lastGeneratedChangeNumber.get();
+ }
+
/**
* Get the number of changes.
* @return Returns the number of changes.
@@ -416,38 +439,37 @@
public List<Attribute> getMonitorData()
{
List<Attribute> attributes = new ArrayList<Attribute>();
+ attributes.add(createChangeNumberAttribute(true));
+ attributes.add(createChangeNumberAttribute(false));
+ attributes.add(Attributes.create("count", Long.toString(count())));
+ return attributes;
+ }
+ private Attribute createChangeNumberAttribute(boolean isFirst)
+ {
+ final String attributeName =
+ isFirst ? "first-draft-changenumber" : "last-draft-changenumber";
+ final String changeNumber = String.valueOf(getChangeNumber(isFirst));
+ return Attributes.create(attributeName, changeNumber);
+ }
+
+ private long getChangeNumber(boolean isFirst)
+ {
try
{
- CNIndexRecord firstCNRecord = db.readFirstRecord();
- String firstCN = String.valueOf(firstCNRecord.getChangeNumber());
- attributes.add(Attributes.create("first-draft-changenumber", firstCN));
- }
- catch (ChangelogException e)
- {
- if (debugEnabled())
- TRACER.debugCaught(DebugLogLevel.WARNING, e);
- attributes.add(Attributes.create("first-draft-changenumber", "0"));
- }
-
- try
- {
- CNIndexRecord lastCNRecord = db.readLastRecord();
- if (lastCNRecord != null)
+ CNIndexRecord record =
+ isFirst ? db.readFirstRecord() : db.readLastRecord();
+ if (record != null)
{
- String lastCN = String.valueOf(lastCNRecord.getChangeNumber());
- attributes.add(Attributes.create("last-draft-changenumber", lastCN));
+ return record.getChangeNumber();
}
}
catch (ChangelogException e)
{
if (debugEnabled())
TRACER.debugCaught(DebugLogLevel.WARNING, e);
- attributes.add(Attributes.create("last-draft-changenumber", "0"));
}
-
- attributes.add(Attributes.create("count", Long.toString(count())));
- return attributes;
+ return 0;
}
/**
--
Gitblit v1.10.0