You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ck...@apache.org on 2016/08/03 05:02:50 UTC

svn commit: r1755017 - /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java

Author: ckoell
Date: Wed Aug  3 05:02:50 2016
New Revision: 1755017

URL: http://svn.apache.org/viewvc?rev=1755017&view=rev
Log:
JCR-3999 Possibility for a Deadlock in FineGrainedISMLocking in a XA Environment

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java?rev=1755017&r1=1755016&r2=1755017&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/FineGrainedISMLocking.java Wed Aug  3 05:02:50 2016
@@ -134,15 +134,21 @@ public class FineGrainedISMLocking imple
             // we want to become the current writer
             Sync exclusive = writerStateRWLock.writeLock();
             exclusive.acquire();
+            Object currentId = getCurrentThreadId();
             try {
                 if (activeWriter == null
                         && !readLockMap.hasDependency(changeLog)) {
                     activeWriter = new WriteLockImpl(changeLog);
-                    activeWriterId = getCurrentThreadId();
+                    activeWriterId = currentId;
                     return activeWriter;
                 } else {
-                    signal = new Latch();
-                    waitingWriters.add(signal);
+                    if (isSameThreadId(activeWriterId, currentId) 
+                            && !readLockMap.hasDependency(changeLog)) {
+                        return activeWriter;
+                    } else {
+                        signal = new Latch();
+                        waitingWriters.add(signal);
+                    }
                 }
             } finally {
                 exclusive.release();