You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2013/08/30 09:59:22 UTC

svn commit: r1518906 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java

Author: mduerig
Date: Fri Aug 30 07:59:22 2013
New Revision: 1518906

URL: http://svn.apache.org/r1518906
Log:
OAK-959: Deadlock between ChangeDispatcher and SegmentNodeStoreService
Move getRoot call out of the lock to avoid deadlock between NodeStore and ChangeDispatcher

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java?rev=1518906&r1=1518905&r2=1518906&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java Fri Aug 30 07:59:22 2013
@@ -24,8 +24,6 @@ import static org.apache.jackrabbit.oak.
 
 import java.util.Queue;
 import java.util.Set;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
@@ -54,7 +52,6 @@ import org.apache.jackrabbit.oak.spi.sta
 public class ChangeDispatcher {
     private final NodeStore store;
     private final Set<Listener> listeners = Sets.newHashSet();
-    private final Lock changeLock = new ReentrantLock();
 
     private NodeState previousRoot;
 
@@ -94,15 +91,10 @@ public class ChangeDispatcher {
         return listener;
     }
 
-    private void contentChanged(@Nonnull NodeState before, @Nonnull NodeState after,
+    private synchronized void contentChanged(@Nonnull NodeState before, @Nonnull NodeState after,
             ContentSession contentSession) {
-        changeLock.lock();
-        try {
-            externalChange(checkNotNull(before));
-            internalChange(checkNotNull(after), contentSession);
-        } finally {
-            changeLock.unlock();
-        }
+        externalChange(checkNotNull(before));
+        internalChange(checkNotNull(after), contentSession);
     }
 
     private void externalChange(NodeState root) {
@@ -118,12 +110,9 @@ public class ChangeDispatcher {
     }
 
     private void externalChange() {
-        if (changeLock.tryLock()) {
-            try {
-                externalChange(store.getRoot());
-            } finally {
-                changeLock.unlock();
-            }
+        NodeState root = store.getRoot();
+        synchronized (this) {
+            externalChange(root);
         }
     }