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