From 71bedb2ae75c5513f8798dafa3fc64d3efd691d5 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 22 Nov 2013 12:00:43 +0000
Subject: [PATCH] Found and fixed a new deadlock with read vs. write locks.
---
opends/src/server/org/opends/server/replication/server/changelog/je/ReplicationDB.java | 18 ++++++++++++++++++
1 files changed, 18 insertions(+), 0 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 2b14cc0..8203e8a 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
@@ -576,6 +576,7 @@
// unlock it when throwing an exception.
dbCloseLock.readLock().lock();
+ boolean cursorHeld = false;
Cursor localCursor = null;
try
{
@@ -609,6 +610,7 @@
}
}
cursor = localCursor;
+ cursorHeld = cursor != null;
}
catch (ChangelogException e)
{
@@ -622,6 +624,13 @@
closeAndReleaseReadLock(localCursor);
throw new ChangelogException(e);
}
+ finally
+ {
+ if (!cursorHeld)
+ {
+ dbCloseLock.readLock().unlock();
+ }
+ }
}
private ReplServerDBCursor() throws ChangelogException
@@ -632,6 +641,7 @@
// We'll go on only if no close or no clear is running
dbCloseLock.readLock().lock();
+ boolean cursorHeld = false;
Transaction localTxn = null;
Cursor localCursor = null;
try
@@ -652,6 +662,7 @@
txn = localTxn;
cursor = localCursor;
+ cursorHeld = cursor != null;
}
catch (ChangelogException e)
{
@@ -665,6 +676,13 @@
abort(localTxn);
throw new ChangelogException(e);
}
+ finally
+ {
+ if (!cursorHeld)
+ {
+ dbCloseLock.readLock().unlock();
+ }
+ }
}
private void abort(Transaction localTxn)
--
Gitblit v1.10.0