From d356a45009acfa47a94f3d023ac38b4c1faadd13 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 17 Dec 2013 15:05:55 +0000
Subject: [PATCH] OPENDJ-1231 Make the Medium Consistency Point support replica heartbeats
---
opends/src/server/org/opends/server/replication/server/changelog/je/ReplicationDB.java | 232 ----------------------------------------------------------
1 files changed, 0 insertions(+), 232 deletions(-)
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/ReplicationDB.java b/opends/src/server/org/opends/server/replication/server/changelog/je/ReplicationDB.java
index 7e3076c..0fcb368 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/ReplicationDB.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/ReplicationDB.java
@@ -59,8 +59,6 @@
*/
public class ReplicationDB
{
- private static final int START = 0;
- private static final int STOP = 1;
private Database db;
private ReplicationDbEnv dbenv;
@@ -901,236 +899,6 @@
}
/**
- * Count the number of changes between 2 changes numbers (inclusive).
- * @param start The lower limit of the count.
- * @param stop The higher limit of the count.
- * @return The number of changes between provided start and stop CSN.
- * Returns 0 when an error occurs.
- */
- public long count(CSN start, CSN stop)
- {
- dbCloseLock.readLock().lock();
- try
- {
- // If the DB has been closed then return immediately.
- if (isDBClosed())
- {
- return 0;
- }
- if (start == null && stop == null)
- {
- return db.count();
- }
-
- int[] counterValues = new int[2];
- int[] distanceToCounterRecords = new int[2];
-
- // Step 1 : from the start point, traverse db to the next counter record
- // or to the stop point.
- findFirstCounterRecordAfterStartPoint(start, stop, counterValues,
- distanceToCounterRecords);
-
- // cases
- if (counterValues[START] == 0)
- return distanceToCounterRecords[START];
-
- // Step 2 : from the stop point, traverse db to the next counter record
- // or to the start point.
- if (!findFirstCounterRecordBeforeStopPoint(start, stop, counterValues,
- distanceToCounterRecords))
- {
- // database is empty
- return 0;
- }
-
- // Step 3 : Now consolidates the result
- return computeDistance(counterValues, distanceToCounterRecords);
- }
- catch (DatabaseException e)
- {
- dbenv.shutdownOnException(e);
- }
- finally
- {
- dbCloseLock.readLock().unlock();
- }
- return 0;
- }
-
- private void findFirstCounterRecordAfterStartPoint(CSN start, CSN stop,
- int[] counterValues, int[] distanceToCounterRecords)
- throws DatabaseException
- {
- Cursor cursor = db.openCursor(null, null);
- try
- {
- OperationStatus status;
- DatabaseEntry key;
- DatabaseEntry data = new DatabaseEntry();
- if (start != null)
- {
- key = createReplicationKey(start);
- status = cursor.getSearchKey(key, data, LockMode.DEFAULT);
- if (status == OperationStatus.NOTFOUND)
- status = cursor.getSearchKeyRange(key, data, LockMode.DEFAULT);
- }
- else
- {
- key = new DatabaseEntry();
- // JNR: I suspect this is equivalent to writing cursor.getFirst().
- // If it is, then please change the code to make it clearer.
- status = cursor.getNext(key, data, LockMode.DEFAULT);
- }
-
- while (status == OperationStatus.SUCCESS)
- {
- // test whether the record is a regular change or a counter
- final CSN csn = toCSN(key.getData());
- if (isACounterRecord(csn))
- {
- // we have found the counter record
- counterValues[START] = decodeCounterValue(data.getData());
- break;
- }
-
- // it is a regular change record
- if (csn.isNewerThan(stop))
- { // we are outside the range: we reached the 'stop' target
- break;
- }
-
- distanceToCounterRecords[START]++;
- status = cursor.getNext(key, data, LockMode.DEFAULT);
- // loop to update the distance and possibly find a counter record
- }
- }
- finally
- {
- close(cursor);
- }
- }
-
- private boolean findFirstCounterRecordBeforeStopPoint(CSN start, CSN stop,
- int[] counterValues, int[] distanceToCounterRecords)
- throws DatabaseException
- {
- Cursor cursor = db.openCursor(null, null);
- try
- {
- DatabaseEntry key = createReplicationKey(stop);
- DatabaseEntry data = new DatabaseEntry();
- OperationStatus status = cursor.getSearchKey(key, data, LockMode.DEFAULT);
- if (status != OperationStatus.SUCCESS)
- {
- key = new DatabaseEntry();
- data = new DatabaseEntry();
- status = cursor.getLast(key, data, LockMode.DEFAULT);
- if (status != OperationStatus.SUCCESS)
- {
- return false;
- }
- }
-
- while (status == OperationStatus.SUCCESS)
- {
- final CSN csn = toCSN(key.getData());
- if (isACounterRecord(csn))
- {
- // we have found the counter record
- counterValues[STOP] = decodeCounterValue(data.getData());
- break;
- }
-
- // it is a regular change record
- if (csn.isOlderThan(start))
- { // we are outside the range: we reached the 'start' target
- break;
- }
-
- distanceToCounterRecords[STOP]++;
- status = cursor.getPrev(key, data, LockMode.DEFAULT);
- // loop to update the distance and possibly find a counter record
- }
- return true;
- }
- finally
- {
- close(cursor);
- }
- }
-
- /**
- * The diagram below shows a visual description of how the distance between
- * two CSNs in the database is computed.
- *
- * <pre>
- * +--------+ +--------+
- * | CASE 1 | | CASE 2 |
- * +--------+ +--------+
- *
- * CSN CSN
- * ----- -----
- * START => ----- START => -----
- * ^ ----- ^ -----
- * | ----- | -----
- * dist 1 ----- dist 1 -----
- * | ----- | -----
- * v ----- v -----
- * CR 1&2 => [1000] CR 1 => [1000]
- * ^ ----- -----
- * | ----- -----
- * dist 2 ----- -----
- * | ----- -----
- * v ----- -----
- * STOP => ----- -----
- * ----- -----
- * CR => [2000] CR 2 => [2000]
- * ----- ^ -----
- * | -----
- * dist 2 -----
- * | -----
- * v -----
- * STOP => -----
- * </pre>
- *
- * Explanation of the terms used:
- * <dl>
- * <dt>START</dt>
- * <dd>Start CSN for the count</dd>
- * <dt>STOP</dt>
- * <dd>Stop CSN for the count</dd>
- * <dt>dist</dt>
- * <dd>Distance from START (or STOP) to the counter record</dd>
- * <dt>CSN</dt>
- * <dd>Stands for "Change Sequence Number". Below it, the database is
- * symbolized, where each record is represented by using dashes "-----". The
- * database is ordered.</dd>
- * <dt>CR</dt>
- * <dd>Stands for "Counter Record". Counter Records are inserted in the
- * database along with real CSNs, but they are not real changes. They are only
- * used to speed up calculating the distance between 2 CSNs without the need
- * to scan the whole database in between.</dd>
- * </dl>
- */
- private long computeDistance(int[] counterValues,
- int[] distanceToCounterRecords)
- {
- if (counterValues[START] != 0)
- {
- if (counterValues[START] == counterValues[STOP])
- {
- // only one counter record between from and to - no need to use it
- return distanceToCounterRecords[START] + distanceToCounterRecords[STOP];
- }
- // at least 2 counter records between from and to
- return distanceToCounterRecords[START]
- + (counterValues[STOP] - counterValues[START])
- + distanceToCounterRecords[STOP];
- }
- return 0;
- }
-
- /**
* Whether a provided CSN represents a counter record. A counter record is
* used to store the time.
*
--
Gitblit v1.10.0