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 {