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);
    }