Author: chetanm
Date: Mon Jun 29 06:03:47 2015
New Revision: 1688090

URL: http://svn.apache.org/r1688090
Log:
OAK-2401 - SegmentNodeStoreService prone to deadlocks

reduce the scope of synchronized code block

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java?rev=1688090&r1=1688089&r2=1688090&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java
 Mon Jun 29 06:03:47 2015
@@ -229,7 +229,7 @@ public class SegmentNodeStoreService ext
 
     private FileStore store;
 
-    private SegmentNodeStore delegate;
+    private volatile SegmentNodeStore delegate;
 
     private ObserverTracker observerTracker;
 
@@ -265,7 +265,7 @@ public class SegmentNodeStoreService ext
     public static final String PROP_BLOB_GC_MAX_AGE = "blobGcMaxAgeInSecs";
 
     @Override
-    protected synchronized SegmentNodeStore getNodeStore() {
+    protected SegmentNodeStore getNodeStore() {
         checkState(delegate != null, "service must be activated when used");
         return delegate;
     }
@@ -445,19 +445,22 @@ public class SegmentNodeStoreService ext
     }
 
     @Deactivate
-    public synchronized void deactivate() {
+    public void deactivate() {
         unregisterNodeStore();
 
-        if (observerTracker != null) {
-            observerTracker.stop();
-        }
-        if (gcMonitor != null) {
-            gcMonitor.stop();
-        }
-        delegate = null;
-        if (store != null) {
-            store.close();
-            store = null;
+        synchronized (this) {
+            if (observerTracker != null) {
+                observerTracker.stop();
+            }
+            if (gcMonitor != null) {
+                gcMonitor.stop();
+            }
+            delegate = null;
+
+            if (store != null) {
+                store.close();
+                store = null;
+            }
         }
     }
 


Reply via email to