Index: oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java =================================================================== --- oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java (revision 1842787) +++ oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java (working copy) @@ -57,6 +57,8 @@ 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 @@ 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 @@ } 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; Index: oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CommitHookEnhancer.java =================================================================== --- oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CommitHookEnhancer.java (revision 1842787) +++ oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CommitHookEnhancer.java (working copy) @@ -19,12 +19,10 @@ 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 { @@ -31,15 +29,10 @@ private final CompositionContext ctx; - private final CompositeNodeBuilder builder; - private final CommitHook hook; - private Optional 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,8 +53,6 @@ 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 { @@ -68,14 +59,4 @@ throw new IllegalStateException("The commit hook result should be a composite node state"); } } - - Optional getUpdatedBuilder() { - return updatedBuilder; - } - - private CompositeNodeBuilder toComposite(NodeState nodeState, CompositeNodeState compositeRoot) { - CompositeNodeBuilder builder = compositeRoot.builder(); - nodeState.compareAgainstBaseState(compositeRoot, new ApplyDiff(builder)); - return builder; - } } Index: oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java =================================================================== --- oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java (revision 1842787) +++ oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java (working copy) @@ -147,13 +147,8 @@ // 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); }