From f2f95003dffb483fd470e679ea55dde9f81b36d9 Mon Sep 17 00:00:00 2001
From: Yannick Lecaillez <ylecaillez@forgerock.com>
Date: Fri, 11 Dec 2015 17:07:04 +0000
Subject: [PATCH] OPENDJ-2543: ChangelogException while doing modrate on PDB instance.
---
opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/Log.java | 18 +++++++++++++++---
1 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/Log.java b/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/Log.java
index b072dfc..110bba7 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/Log.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/Log.java
@@ -773,7 +773,8 @@
}
/**
- * Abort all cursors opened on the provided log file.
+ * Abort all cursors opened on the provided log file.
+ * @GuardedBy("exclusiveLock")
*/
private void abortCursorsOpenOnLogFile(LogFile<K, V> logFile)
{
@@ -1079,6 +1080,7 @@
}
}
+ /** @GuardedBy("exclusiveLock") */
private void abortAllOpenCursors() throws ChangelogException
{
for (AbortableLogCursor<K, V> cursor : openCursors)
@@ -1539,8 +1541,18 @@
@Override
public void close()
{
- delegate.close();
- log.unregisterCursor(this);
+ // Lock is needed here to ensure that log cursor cannot be closed while still referenced in the cursor list.
+ // Removing the cursor before the close is not enough due to the CopyOnWrite nature of the cursor list.
+ log.sharedLock.lock();
+ try
+ {
+ delegate.close();
+ log.unregisterCursor(this);
+ }
+ finally
+ {
+ log.sharedLock.unlock();
+ }
}
@Override
--
Gitblit v1.10.0