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 mr...@apache.org on 2018/10/04 09:40:34 UTC
svn commit: r1842791 - in /jackrabbit/oak/trunk:
oak-it/src/test/java/org/apache/jackrabbit/oak/composite/
oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/
Author: mreutegg
Date: Thu Oct 4 09:40:33 2018
New Revision: 1842791
URL: http://svn.apache.org/viewvc?rev=1842791&view=rev
Log:
OAK-7801: CompositeNodeStore.merge() may trigger conflicting branches
Modified:
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java
jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CommitHookEnhancer.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/CompositeNodeStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java?rev=1842791&r1=1842790&r2=1842791&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java Thu Oct 4 09:40:33 2018
@@ -57,6 +57,8 @@ import org.apache.jackrabbit.oak.api.Com
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.plugins.document.DocumentMK;
import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
+import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreBuilder;
+import org.apache.jackrabbit.oak.plugins.document.LeaseCheckMode;
import org.apache.jackrabbit.oak.plugins.document.rdb.RDBDataSourceFactory;
import org.apache.jackrabbit.oak.plugins.document.rdb.RDBOptions;
import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
@@ -686,6 +688,28 @@ public class CompositeNodeStoreTest {
store.merge(builder, hook, CommitInfo.EMPTY);
}
+ @Test
+ public void bigPropertyIndexUpdate() throws Exception{
+ NodeBuilder globalBuilder = globalStore.getRoot().builder();
+ createIndexDefinition(globalBuilder.child(INDEX_DEFINITIONS_NAME), "foo",
+ true, false, ImmutableSet.of("foo"), null);
+ EditorHook hook = new EditorHook(
+ new IndexUpdateProvider(new PropertyIndexEditorProvider().with(mip)));
+
+ globalStore.merge(globalBuilder, hook, CommitInfo.EMPTY);
+
+ int updateLimit = new DocumentNodeStoreBuilder().getUpdateLimit();
+ NodeBuilder builder = store.getRoot().builder();
+ for (int i = 0; i < updateLimit; i++) {
+ builder.child("content").child("node-" + i).setProperty("foo", "bar");
+ }
+ store.merge(builder, hook, CommitInfo.EMPTY);
+
+ builder = store.getRoot().builder();
+ builder.child("content").remove();
+ store.merge(builder, hook, CommitInfo.EMPTY);
+ }
+
private static enum NodeStoreKind {
MEMORY {
@Override
@@ -780,7 +804,9 @@ public class CompositeNodeStoreTest {
}
ds = RDBDataSourceFactory.forJdbcUrl(jdbcUrl, "sa", "");
- instance = new DocumentMK.Builder().setRDBConnection(ds, options).getNodeStore();
+ instance = new DocumentMK.Builder()
+ .setRDBConnection(ds, options).build();
+ instance.setMaxBackOffMillis(0);
return instance;
Modified: jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CommitHookEnhancer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CommitHookEnhancer.java?rev=1842791&r1=1842790&r2=1842791&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CommitHookEnhancer.java (original)
+++ jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CommitHookEnhancer.java Thu Oct 4 09:40:33 2018
@@ -19,27 +19,20 @@ package org.apache.jackrabbit.oak.compos
import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.spi.commit.CommitHook;
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
-import org.apache.jackrabbit.oak.spi.state.ApplyDiff;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
-import java.util.Optional;
import static com.google.common.collect.Maps.newHashMap;
class CommitHookEnhancer implements CommitHook {
private final CompositionContext ctx;
- private final CompositeNodeBuilder builder;
-
private final CommitHook hook;
- private Optional<CompositeNodeBuilder> updatedBuilder = Optional.empty();
-
- CommitHookEnhancer(CommitHook hook, CompositionContext ctx, CompositeNodeBuilder builder) {
+ CommitHookEnhancer(CommitHook hook, CompositionContext ctx) {
this.ctx = ctx;
- this.builder = builder;
this.hook = hook;
}
@@ -60,22 +53,10 @@ class CommitHookEnhancer implements Comm
CompositeNodeState compositeAfter = ctx.createRootNodeState(afterStates);
NodeState result = hook.processCommit(compositeBefore, compositeAfter, info);
- updatedBuilder = Optional.of(toComposite(result, compositeBefore));
-
if (result instanceof CompositeNodeState) {
return ((CompositeNodeState) result).getNodeState(ctx.getGlobalStore());
} else {
throw new IllegalStateException("The commit hook result should be a composite node state");
}
}
-
- Optional<CompositeNodeBuilder> getUpdatedBuilder() {
- return updatedBuilder;
- }
-
- private CompositeNodeBuilder toComposite(NodeState nodeState, CompositeNodeState compositeRoot) {
- CompositeNodeBuilder builder = compositeRoot.builder();
- nodeState.compareAgainstBaseState(compositeRoot, new ApplyDiff(builder));
- return builder;
- }
}
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=1842791&r1=1842790&r2=1842791&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 Thu Oct 4 09:40:33 2018
@@ -147,13 +147,8 @@ public class CompositeNodeStore implemen
// merge the global builder and apply the commit hooks within
MountedNodeStore globalStore = ctx.getGlobalStore();
- CommitHookEnhancer hookEnhancer = new CommitHookEnhancer(commitHook, ctx, nodeBuilder);
+ CommitHookEnhancer hookEnhancer = new CommitHookEnhancer(commitHook, ctx);
NodeState globalResult = globalStore.getNodeStore().merge(nodeBuilder.getNodeBuilder(globalStore), hookEnhancer, info);
- if (!hookEnhancer.getUpdatedBuilder().isPresent()) {
- // it means that the commit hook wasn't invoked, because there were
- // no changes on the global store. we should invoke it anyway.
- hookEnhancer.processCommit(globalResult, globalResult, info);
- }
return ctx.createRootNodeState(globalResult);
}