Author: tomekr
Date: Tue Jul 18 08:13:22 2017
New Revision: 1802250

URL: http://svn.apache.org/viewvc?rev=1802250&view=rev
Log:
OAK-6455: Don't call observer concurrently from the CompositeNodeStore

Modified:
    
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/AtomicCompositeMergeTest.java
    
jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java

Modified: 
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/AtomicCompositeMergeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/AtomicCompositeMergeTest.java?rev=1802250&r1=1802249&r2=1802250&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/AtomicCompositeMergeTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/AtomicCompositeMergeTest.java
 Tue Jul 18 08:13:22 2017
@@ -84,7 +84,6 @@ public class AtomicCompositeMergeTest {
     }
 
     @Test
-    @Ignore
     public void testLocalMerges() throws InterruptedException, IOException, 
ParseException, CommitFailedException {
         Oak oak = getOak(getCompositeNodeStore(new MemoryNodeStore()));
         testAtomicMerges(clusterId -> oak);

Modified: 
jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java?rev=1802250&r1=1802249&r2=1802250&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java
 Tue Jul 18 08:13:22 2017
@@ -136,35 +136,40 @@ public class CompositeNodeStore implemen
 
         assertNoChangesOnReadOnlyMounts(nodeBuilder);
 
-        // merge the global builder and apply the commit hooks within
-        Map<MountedNodeStore, NodeState> resultStates = newHashMap();
-        MountedNodeStore globalStore = ctx.getGlobalStore();
-        CommitHookEnhancer hookEnhancer = new CommitHookEnhancer(commitHook, 
ctx, nodeBuilder.getBuilders());
-        NodeState globalResult = 
globalStore.getNodeStore().merge(nodeBuilder.getBuilders().get(globalStore), 
hookEnhancer, info);
-        resultStates.put(globalStore, globalResult);
-        CompositeNodeBuilder updatedBuilder = 
hookEnhancer.getUpdatedBuilder().orElse(nodeBuilder);
-
-        // merge the partial builders
-        for (MountedNodeStore mns : ctx.getNonDefaultStores()) {
-            NodeBuilder partialBuilder = updatedBuilder.getBuilders().get(mns);
-
-            if (mns.getMount().isReadOnly()) {
-                if 
(!partialBuilder.getNodeState().equals(partialBuilder.getBaseState())) {
-                    throw new CommitFailedException("CompositeStore", 31, 
"Unable to perform changes on read-only mount " + mns.getMount().getName());
+        mergeLock.lock();
+        try {
+            // merge the global builder and apply the commit hooks within
+            Map<MountedNodeStore, NodeState> resultStates = newHashMap();
+            MountedNodeStore globalStore = ctx.getGlobalStore();
+            CommitHookEnhancer hookEnhancer = new 
CommitHookEnhancer(commitHook, ctx, nodeBuilder.getBuilders());
+            NodeState globalResult = 
globalStore.getNodeStore().merge(nodeBuilder.getBuilders().get(globalStore), 
hookEnhancer, info);
+            resultStates.put(globalStore, globalResult);
+            CompositeNodeBuilder updatedBuilder = 
hookEnhancer.getUpdatedBuilder().orElse(nodeBuilder);
+
+            // merge the partial builders
+            for (MountedNodeStore mns : ctx.getNonDefaultStores()) {
+                NodeBuilder partialBuilder = 
updatedBuilder.getBuilders().get(mns);
+
+                if (mns.getMount().isReadOnly()) {
+                    if 
(!partialBuilder.getNodeState().equals(partialBuilder.getBaseState())) {
+                        throw new CommitFailedException("CompositeStore", 31, 
"Unable to perform changes on read-only mount " + mns.getMount().getName());
+                    }
+                    resultStates.put(mns, partialBuilder.getBaseState());
+                    continue;
                 }
-                resultStates.put(mns, partialBuilder.getBaseState());
-                continue;
-            }
 
-            NodeState partialState = mns.getNodeStore().merge(partialBuilder, 
EmptyHook.INSTANCE, info);
-            resultStates.put(mns, partialState);
-        }
+                NodeState partialState = 
mns.getNodeStore().merge(partialBuilder, EmptyHook.INSTANCE, info);
+                resultStates.put(mns, partialState);
+            }
 
-        CompositeNodeState newRoot = ctx.createRootNodeState(resultStates);
-        for (Observer observer : observers) {
-            observer.contentChanged(newRoot, info);
+            CompositeNodeState newRoot = ctx.createRootNodeState(resultStates);
+            for (Observer observer : observers) {
+                observer.contentChanged(newRoot, info);
+            }
+            return newRoot;
+        } finally {
+            mergeLock.unlock();
         }
-        return newRoot;
    }
 
     private void assertNoChangesOnReadOnlyMounts(CompositeNodeBuilder 
nodeBuilder) throws CommitFailedException {


Reply via email to