From 2d735189c834108a2e5f7a795610372eb6d00aed Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Tue, 03 Jun 2014 08:45:08 +0000
Subject: [PATCH] OPENDJ-1467 : File Based Changelog must support replicas temporarily leaving the topology
---
opends/src/server/org/opends/server/replication/server/changelog/file/Log.java | 27 +++++++++++++++++++--------
1 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/file/Log.java b/opends/src/server/org/opends/server/replication/server/changelog/file/Log.java
index 200c084..350b70e 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/file/Log.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/file/Log.java
@@ -158,7 +158,7 @@
/**
* The last key appended to the log. In order to keep the ordering of the keys
* in the log, any attempt to append a record with a key lower or equal to
- * this key will silently fail.
+ * this is rejected (no error but an event is logged).
*/
private K lastAppendedKey;
@@ -342,6 +342,10 @@
/**
* Add the provided record at the end of this log.
* <p>
+ * The record must have a key strictly higher than the key
+ * of the last record added. If it is not the case, the record is not
+ * appended and the method returns immediately.
+ * <p>
* In order to ensure that record is written out of buffers and persisted
* to file system, it is necessary to explicitely call the
* {@code syncToFileSystem()} method.
@@ -349,7 +353,7 @@
* @param record
* The record to add.
* @throws ChangelogException
- * If the record can't be added to the log.
+ * If an error occurs while adding the record to the log.
*/
public void append(final Record<K, V> record) throws ChangelogException
{
@@ -766,7 +770,7 @@
catch (IOException e)
{
throw new ChangelogException(
- ERR_CHANGELOG_UNABLE_TO_RENAME_HEAD_LOG_FILE.get(HEAD_LOG_FILE_NAME, rotatedLogFile.getPath()), e);
+ ERR_CHANGELOG_UNABLE_TO_RENAME_HEAD_LOG_FILE.get(headLogFile.getPath(), rotatedLogFile.getPath()), e);
}
}
@@ -842,8 +846,8 @@
private void openHeadLogFile() throws ChangelogException
{
final LogFile<K, V> head = LogFile.newAppendableLogFile(new File(logPath, HEAD_LOG_FILE_NAME), recordParser);
- Record<K,V> newestRecord = head.getNewestRecord();
- lastAppendedKey = newestRecord == null ? null : newestRecord.getKey();
+ final Record<K,V> newestRecord = head.getNewestRecord();
+ lastAppendedKey = newestRecord != null ? newestRecord.getKey() : null;
logFiles.put(recordParser.getMaxKey(), head);
}
@@ -897,7 +901,7 @@
/**
* Represents a cursor than can be repositioned on a given key.
*/
- static interface RepositionableCursor<K extends Comparable<K>,V> extends DBCursor<Record<K, V>>
+ static interface RepositionableCursor<K extends Comparable<K>, V> extends DBCursor<Record<K, V>>
{
/**
* Position the cursor to the record corresponding to the provided key or to
@@ -1011,9 +1015,9 @@
if (key != null)
{
boolean isFound = currentCursor.positionTo(key, findNearest);
- if (isFound && getRecord() == null)
+ if (isFound && getRecord() == null && !log.isHeadLogFile(currentLogFile))
{
- // The key to position to may be in the next file, force the switch
+ // The key to position is probably in the next file, force the switch
isFound = next();
}
return isFound;
@@ -1047,6 +1051,13 @@
currentLogFile = logFile;
currentCursor = currentLogFile.getCursor();
}
+
+ /** {@inheritDoc} */
+ public String toString()
+ {
+ return String.format("Cursor on log : %s, current log file: %s, current cursor: %s",
+ log.logPath, currentLogFile.getFile().getName(), currentCursor);
+ }
}
/** An empty cursor, that always return null records and false to {@code next()} method. */
--
Gitblit v1.10.0