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 al...@apache.org on 2014/01/20 21:40:21 UTC

svn commit: r1559827 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/ref...

Author: alexparvulescu
Date: Mon Jan 20 20:40:20 2014
New Revision: 1559827

URL: http://svn.apache.org/r1559827
Log:
OAK-1292 Avoid async indexer commits when there are no changes to index


Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateCallback.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/CompositeIndexEditorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexEditorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdate.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditorProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardIndexEditorProvider.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdateTest.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorProvider.java
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditor.java
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java
    jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrIndexEditorProviderService.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java Mon Jan 20 20:40:20 2014
@@ -24,6 +24,7 @@ import static org.apache.jackrabbit.oak.
 
 import java.util.Calendar;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.annotation.Nonnull;
 
@@ -98,8 +99,6 @@ public class AsyncIndexUpdate implements
             return;
         }
 
-        preAsyncRun(store);
-
         NodeBuilder builder = store.getRoot().builder();
         NodeBuilder async = builder.child(ASYNC);
 
@@ -112,30 +111,49 @@ public class AsyncIndexUpdate implements
             before = MISSING_NODE;
         }
 
-        CommitFailedException exception = EditorDiff.process(new IndexUpdate(
-                provider, name, after, builder), before, after);
+        final AtomicBoolean dirty = new AtomicBoolean(false);
+
+        IndexUpdateCallback callback = new IndexUpdateCallback() {
+
+            @Override
+            public void beforeIndex() throws CommitFailedException {
+                if (dirty.get()) {
+                    return;
+                }
+                preAsyncRun(store, name);
+                dirty.set(true);
+            }
+        };
+
+        IndexUpdate indexUpdate = new IndexUpdate(provider, name, after,
+                builder, callback);
+
+        CommitFailedException exception = EditorDiff.process(indexUpdate,
+                before, after);
         if (exception == null) {
-            try {
-                async.setProperty(name, checkpoint);
-                postAsyncRunStatus(builder);
-                store.merge(builder, new CommitHook() {
-                    @Override
-                    @Nonnull
-                    public NodeState processCommit(NodeState before,
-                            NodeState after) throws CommitFailedException {
-                        // check for concurrent updates by this async task
-                        PropertyState stateAfterRebase = before.getChildNode(
-                                ASYNC).getProperty(name);
-                        if (Objects.equal(state, stateAfterRebase)) {
-                            return after;
-                        } else {
-                            throw CONCURRENT_UPDATE;
+            async.setProperty(name, checkpoint);
+            if (dirty.get()) {
+                try {
+                    store.merge(builder, new CommitHook() {
+                        @Override
+                        @Nonnull
+                        public NodeState processCommit(NodeState before,
+                                NodeState after) throws CommitFailedException {
+                            // check for concurrent updates by this async task
+                            PropertyState stateAfterRebase = before
+                                    .getChildNode(ASYNC).getProperty(name);
+                            if (Objects.equal(state, stateAfterRebase)) {
+                                return postAsyncRunStatus(after.builder())
+                                        .getNodeState();
+                            } else {
+                                throw CONCURRENT_UPDATE;
+                            }
                         }
+                    }, null);
+                } catch (CommitFailedException e) {
+                    if (e != CONCURRENT_UPDATE) {
+                        exception = e;
                     }
-                }, null);
-            } catch (CommitFailedException e) {
-                if (e != CONCURRENT_UPDATE) {
-                    exception = e;
                 }
             }
         }
@@ -153,17 +171,14 @@ public class AsyncIndexUpdate implements
         }
     }
 
-    private void preAsyncRun(NodeStore store) {
+    private static void preAsyncRun(NodeStore store, String name)
+            throws CommitFailedException {
         NodeBuilder builder = store.getRoot().builder();
         preAsyncRunStatus(builder);
-        try {
-            store.merge(builder, EmptyHook.INSTANCE, null);
-        } catch (CommitFailedException e) {
-            log.warn("Index status update {} failed", name, e);
-        }
+        store.merge(builder, EmptyHook.INSTANCE, null);
     }
 
-    private boolean isAlreadyRunning(NodeStore store) {
+    private static boolean isAlreadyRunning(NodeStore store) {
         NodeState indexState = store.getRoot().getChildNode(IndexConstants.INDEX_DEFINITIONS_NAME);
 
         //Probably the first run
@@ -198,11 +213,12 @@ public class AsyncIndexUpdate implements
                 .removeProperty("async-done");
     }
 
-    private static void postAsyncRunStatus(NodeBuilder builder) {
+    private static NodeBuilder postAsyncRunStatus(NodeBuilder builder) {
         builder.getChildNode(IndexConstants.INDEX_DEFINITIONS_NAME)
                 .setProperty("async-status", "done")
                 .setProperty("async-done", now(), Type.DATE)
                 .removeProperty("async-start");
+        return builder;
     }
 
     private static String now() {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/CompositeIndexEditorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/CompositeIndexEditorProvider.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/CompositeIndexEditorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/CompositeIndexEditorProvider.java Mon Jan 20 20:40:20 2014
@@ -43,7 +43,7 @@ public class CompositeIndexEditorProvide
             return new IndexEditorProvider() {
                 @Override
                 public Editor getIndexEditor(
-                        String type, NodeBuilder builder, NodeState root) {
+                        String type, NodeBuilder builder, NodeState root, IndexUpdateCallback callback) {
                     return null;
                 }
             };
@@ -67,11 +67,11 @@ public class CompositeIndexEditorProvide
 
     @Override
     public Editor getIndexEditor(
-            String type, NodeBuilder builder, NodeState root)
+            String type, NodeBuilder builder, NodeState root, IndexUpdateCallback callback)
             throws CommitFailedException {
         List<Editor> indexes = Lists.newArrayList();
         for (IndexEditorProvider provider : providers) {
-            Editor e = provider.getIndexEditor(type, builder, root);
+            Editor e = provider.getIndexEditor(type, builder, root, callback);
             if (e != null) {
                 indexes.add(e);
             }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexEditorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexEditorProvider.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexEditorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexEditorProvider.java Mon Jan 20 20:40:20 2014
@@ -44,10 +44,12 @@ public interface IndexEditorProvider {
      * @param type  index type
      * @param definition index definition node builder, used for updates
      * @param root root node state, used for things like node type information
+     * @param callback used to register for index update notifications
      * @return index update editor, or {@code null} if type is unknown
      */
     @CheckForNull
     Editor getIndexEditor(
             @Nonnull String type, @Nonnull NodeBuilder definition,
-            @Nonnull NodeState root) throws CommitFailedException;
+            @Nonnull NodeState root, 
+            @CheckForNull IndexUpdateCallback callback) throws CommitFailedException;
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdate.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdate.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdate.java Mon Jan 20 20:40:20 2014
@@ -61,13 +61,20 @@ class IndexUpdate implements Editor {
      */
     private final List<Editor> reindex = newArrayList();
 
+    /**
+     * Callback for the 'before' events of the indexing job
+     */
+    private final IndexUpdateCallback updateCallback;
+
     IndexUpdate(
             IndexEditorProvider provider, String async,
-            NodeState root, NodeBuilder builder) {
+            NodeState root, NodeBuilder builder,
+            IndexUpdateCallback updateCallback) {
         this.provider = checkNotNull(provider);
         this.async = async;
         this.root = checkNotNull(root);
         this.builder = checkNotNull(builder);
+        this.updateCallback = updateCallback;
     }
 
     private IndexUpdate(IndexUpdate parent, String name) {
@@ -76,6 +83,7 @@ class IndexUpdate implements Editor {
         this.async = parent.async;
         this.root = parent.root;
         this.builder = parent.builder.child(checkNotNull(name));
+        this.updateCallback = parent.updateCallback;
     }
 
     @Override
@@ -101,7 +109,7 @@ class IndexUpdate implements Editor {
             NodeBuilder definition = definitions.getChildNode(name);
             if (Objects.equal(async, definition.getString(ASYNC_PROPERTY_NAME))) {
                 String type = definition.getString(TYPE_PROPERTY_NAME);
-                Editor editor = provider.getIndexEditor(type, definition, root);
+                Editor editor = provider.getIndexEditor(type, definition, root, updateCallback);
                 if (editor == null) {
                     // trigger reindexing when an indexer becomes available
                     definition.setProperty(REINDEX_PROPERTY_NAME, true);

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateCallback.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateCallback.java?rev=1559827&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateCallback.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateCallback.java Mon Jan 20 20:40:20 2014
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.index;
+
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+
+public abstract class IndexUpdateCallback {
+
+    private boolean dirty = false;
+
+    public void indexUpdate() throws CommitFailedException {
+        if (!dirty) {
+            dirty = true;
+            beforeIndex();
+        }
+    }
+
+    /**
+     * Called when the indexer finds the first changes that need indexing when
+     * running the diff
+     */
+    abstract protected void beforeIndex() throws CommitFailedException;
+
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateCallback.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateCallback.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateProvider.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateProvider.java Mon Jan 20 20:40:20 2014
@@ -43,7 +43,7 @@ public class IndexUpdateProvider impleme
     @Override @CheckForNull
     public Editor getRootEditor(
             NodeState before, NodeState after, NodeBuilder builder) {
-        return new IndexUpdate(provider, async, after, builder);
+        return new IndexUpdate(provider, async, after, builder, null);
     }
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java Mon Jan 20 20:40:20 2014
@@ -37,6 +37,7 @@ import org.apache.jackrabbit.oak.api.Com
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditor;
+import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
 import org.apache.jackrabbit.oak.plugins.index.property.strategy.ContentMirrorStoreStrategy;
 import org.apache.jackrabbit.oak.plugins.index.property.strategy.IndexStoreStrategy;
 import org.apache.jackrabbit.oak.plugins.index.property.strategy.UniqueEntryStoreStrategy;
@@ -101,7 +102,10 @@ class PropertyIndexEditor implements Ind
      */
     private Set<String> afterKeys;
 
-    public PropertyIndexEditor(NodeBuilder definition, NodeState root) {
+    private final IndexUpdateCallback updateCallback;
+
+    public PropertyIndexEditor(NodeBuilder definition, NodeState root,
+            IndexUpdateCallback updateCallback) {
         this.parent = null;
         this.name = null;
         this.path = "/";
@@ -130,6 +134,7 @@ class PropertyIndexEditor implements Ind
         } else {
             this.keysToCheckForUniqueness = null;
         }
+        this.updateCallback = updateCallback;
     }
 
     private PropertyIndexEditor(PropertyIndexEditor parent, String name) {
@@ -140,6 +145,7 @@ class PropertyIndexEditor implements Ind
         this.propertyNames = parent.propertyNames;
         this.typePredicate = parent.typePredicate;
         this.keysToCheckForUniqueness = parent.keysToCheckForUniqueness;
+        this.updateCallback = parent.updateCallback;
     }
 
     /**
@@ -235,6 +241,9 @@ class PropertyIndexEditor implements Ind
             }
 
             if (!beforeKeys.isEmpty() || !afterKeys.isEmpty()) {
+                if (updateCallback != null) {
+                    updateCallback.indexUpdate();
+                }
                 NodeBuilder index = definition.child(INDEX_CONTENT_NODE_NAME);
                 getStrategy(keysToCheckForUniqueness != null).update(
                         index, getPath(), beforeKeys, afterKeys);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditorProvider.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditorProvider.java Mon Jan 20 20:40:20 2014
@@ -20,6 +20,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Service;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
+import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
@@ -38,9 +39,9 @@ public class PropertyIndexEditorProvider
 
     @Override
     public Editor getIndexEditor(
-            String type, NodeBuilder definition, NodeState root) {
+            String type, NodeBuilder definition, NodeState root, IndexUpdateCallback callback) {
         if (TYPE.equals(type)) {
-            return new PropertyIndexEditor(definition, root);
+            return new PropertyIndexEditor(definition, root, callback);
         }
         return null;
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditorProvider.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditorProvider.java Mon Jan 20 20:40:20 2014
@@ -21,6 +21,7 @@ import static org.apache.jackrabbit.oak.
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -31,7 +32,7 @@ public class ReferenceEditorProvider imp
 
     @Override
     public Editor getIndexEditor(String type, NodeBuilder definition,
-            NodeState root) {
+            NodeState root, IndexUpdateCallback callback) {
         if (TYPE.equals(type)) {
             return new ReferenceEditor(definition, root);
         }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardIndexEditorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardIndexEditorProvider.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardIndexEditorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardIndexEditorProvider.java Mon Jan 20 20:40:20 2014
@@ -21,6 +21,7 @@ package org.apache.jackrabbit.oak.spi.wh
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.index.CompositeIndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -38,15 +39,15 @@ public class WhiteboardIndexEditorProvid
     }
 
     @Override
-    public Editor getIndexEditor(
-            String type, NodeBuilder builder, NodeState root)
+    public Editor getIndexEditor(String type, NodeBuilder builder,
+            NodeState root, IndexUpdateCallback callback)
             throws CommitFailedException {
         IndexEditorProvider composite = CompositeIndexEditorProvider
                 .compose(getServices());
         if (composite == null) {
             return null;
         }
-        return composite.getIndexEditor(type, builder, root);
+        return composite.getIndexEditor(type, builder, root, callback);
     }
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdateTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdateTest.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdateTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdateTest.java Mon Jan 20 20:40:20 2014
@@ -22,6 +22,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.plugins.index.IndexUtils.createIndexDefinition;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
 
 import java.util.Set;
 
@@ -86,6 +87,8 @@ public class AsyncIndexUpdateTest {
         // first check that the index content nodes exist
         checkPathExists(root, INDEX_DEFINITIONS_NAME, "rootIndex",
                 INDEX_CONTENT_NODE_NAME);
+        assertFalse(root.getChildNode(INDEX_DEFINITIONS_NAME).hasChildNode(
+                ":conflict"));
 
         PropertyIndexLookup lookup = new PropertyIndexLookup(root);
         assertEquals(ImmutableSet.of("testRoot"), find(lookup, "foo", "abc"));

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java Mon Jan 20 20:40:20 2014
@@ -33,6 +33,7 @@ import org.apache.jackrabbit.oak.api.Com
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditor;
+import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -70,11 +71,13 @@ public class LuceneIndexEditor implement
 
     private boolean propertiesChanged = false;
 
-    LuceneIndexEditor(NodeBuilder definition, Analyzer analyzer) throws CommitFailedException {
+    LuceneIndexEditor(NodeBuilder definition, Analyzer analyzer,
+            IndexUpdateCallback updateCallback) throws CommitFailedException {
         this.parent = null;
         this.name = null;
         this.path = "/";
-        this.context = new LuceneIndexEditorContext(definition, analyzer);
+        this.context = new LuceneIndexEditorContext(definition, analyzer,
+                updateCallback);
     }
 
     private LuceneIndexEditor(LuceneIndexEditor parent, String name) {
@@ -158,6 +161,7 @@ public class LuceneIndexEditor implement
             // Remove all index entries in the removed subtree
             writer.deleteDocuments(newPathTerm(path));
             writer.deleteDocuments(new PrefixQuery(newPathTerm(path + "/")));
+            this.context.indexUpdate();
         } catch (IOException e) {
             throw new CommitFailedException(
                     "Lucene", 5, "Failed to remove the index entries of"
@@ -182,7 +186,7 @@ public class LuceneIndexEditor implement
         return false;
     }
 
-    private Document makeDocument(String path, NodeState state, boolean isUpdate) {
+    private Document makeDocument(String path, NodeState state, boolean isUpdate) throws CommitFailedException {
         Document document = new Document();
         boolean dirty = false;
         for (PropertyState property : state.getProperties()) {
@@ -191,10 +195,12 @@ public class LuceneIndexEditor implement
                     && (context.getPropertyTypes() & (1 << property.getType()
                             .tag())) != 0 && context.includeProperty(pname)) {
                 if (Type.BINARY.tag() == property.getType().tag()) {
+                    this.context.indexUpdate();
                     addBinaryValue(document, property, state);
                     dirty = true;
                 } else {
                     for (String value : property.getValue(Type.STRINGS)) {
+                        this.context.indexUpdate();
                         document.add(newPropertyField(pname, value));
                         document.add(newFulltextField(value));
                         dirty = true;

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorContext.java Mon Jan 20 20:40:20 2014
@@ -29,8 +29,10 @@ import java.util.Set;
 
 import javax.jcr.PropertyType;
 
+import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.index.IndexWriter;
@@ -102,7 +104,9 @@ public class LuceneIndexEditorContext {
 
     private long indexedNodes;
 
-    LuceneIndexEditorContext(NodeBuilder definition, Analyzer analyzer) {
+    private final IndexUpdateCallback updateCallback;
+
+    LuceneIndexEditorContext(NodeBuilder definition, Analyzer analyzer, IndexUpdateCallback updateCallback) {
         this.definition = definition;
         this.config = getIndexWriterConfig(analyzer);
 
@@ -127,6 +131,7 @@ public class LuceneIndexEditorContext {
             excludes = ImmutableSet.of();
         }
         this.indexedNodes = 0;
+        this.updateCallback = updateCallback;
     }
 
     int getPropertyTypes() {
@@ -166,4 +171,10 @@ public class LuceneIndexEditorContext {
         return indexedNodes;
     }
 
+    void indexUpdate() throws CommitFailedException {
+        if (this.updateCallback != null) {
+            updateCallback.indexUpdate();
+        }
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorProvider.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorProvider.java Mon Jan 20 20:40:20 2014
@@ -16,14 +16,15 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.lucene;
 
-import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.TYPE_LUCENE;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.ANALYZER;
+import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.TYPE_LUCENE;
 
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditor;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -47,10 +48,10 @@ public class LuceneIndexEditorProvider i
 
     @Override
     public Editor getIndexEditor(
-            String type, NodeBuilder definition, NodeState root)
+            String type, NodeBuilder definition, NodeState root, IndexUpdateCallback callback)
             throws CommitFailedException {
         if (TYPE_LUCENE.equals(type)) {
-            return new LuceneIndexEditor(definition, analyzer);
+            return new LuceneIndexEditor(definition, analyzer, callback);
         }
         return null;
     }

Modified: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditor.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditor.java (original)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditor.java Mon Jan 20 20:40:20 2014
@@ -25,6 +25,7 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditor;
+import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
 import org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfiguration;
 import org.apache.jackrabbit.oak.plugins.index.solr.util.OakSolrUtils;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
@@ -57,15 +58,19 @@ public class SolrIndexEditor implements 
 
     private boolean propertiesChanged = false;
 
+    private IndexUpdateCallback updateCallback;
+
     SolrIndexEditor(
             NodeBuilder definition, SolrServer solrServer,
-            OakSolrConfiguration configuration) throws CommitFailedException {
+            OakSolrConfiguration configuration,
+            IndexUpdateCallback callback) throws CommitFailedException {
         this.parent = null;
         this.name = null;
         this.path = "/";
         this.definition = definition;
         this.solrServer = solrServer;
         this.configuration = configuration;
+        this.updateCallback = callback;
     }
 
     private SolrIndexEditor(SolrIndexEditor parent, String name) {
@@ -75,6 +80,7 @@ public class SolrIndexEditor implements 
         this.definition = parent.definition;
         this.solrServer = parent.solrServer;
         this.configuration = parent.configuration;
+        this.updateCallback = parent.updateCallback;
     }
 
     public String getPath() {
@@ -92,6 +98,7 @@ public class SolrIndexEditor implements 
     public void leave(NodeState before, NodeState after)
             throws CommitFailedException {
         if (propertiesChanged || !before.exists()) {
+            indexUpdate();
             try {
                 solrServer.add(docFromState(after));
             } catch (SolrServerException e) {
@@ -152,6 +159,7 @@ public class SolrIndexEditor implements 
         try {
             solrServer.deleteByQuery(String.format(
                     "%s:%s\\/*", configuration.getPathField(), path));
+            indexUpdate();
         } catch (SolrServerException e) {
             throw new CommitFailedException(
                     "Solr", 5, "Failed to remove documents from Solr", e);
@@ -191,4 +199,10 @@ public class SolrIndexEditor implements 
         return inputDocument;
     }
 
+    protected void indexUpdate() throws CommitFailedException {
+        if (updateCallback != null) {
+            updateCallback.indexUpdate();
+        }
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java (original)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/index/SolrIndexEditorProvider.java Mon Jan 20 20:40:20 2014
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.plugin
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
 import org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfigurationProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.query.SolrQueryIndex;
 import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
@@ -50,7 +51,7 @@ public class SolrIndexEditorProvider imp
 
     @Override
     public Editor getIndexEditor(
-            String type, NodeBuilder definition, NodeState root)
+            String type, NodeBuilder definition, NodeState root, IndexUpdateCallback callback)
             throws CommitFailedException {
 
         if (SolrQueryIndex.TYPE.equals(type)
@@ -59,7 +60,7 @@ public class SolrIndexEditorProvider imp
                 return new SolrIndexEditor(
                         definition,
                         solrServerProvider.getSolrServer(),
-                        oakSolrConfigurationProvider.getConfiguration());
+                        oakSolrConfigurationProvider.getConfiguration(), callback);
             } catch (Exception e) {
                 if (log.isErrorEnabled()) {
                     log.error("unable to create SolrIndexEditor", e);

Modified: jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrIndexEditorProviderService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrIndexEditorProviderService.java?rev=1559827&r1=1559826&r2=1559827&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrIndexEditorProviderService.java (original)
+++ jackrabbit/oak/trunk/oak-solr-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/solr/osgi/SolrIndexEditorProviderService.java Mon Jan 20 20:40:20 2014
@@ -27,6 +27,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Service;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
 import org.apache.jackrabbit.oak.plugins.index.solr.configuration.OakSolrConfigurationProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.index.SolrIndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.solr.server.SolrServerProvider;
@@ -55,11 +56,11 @@ public class SolrIndexEditorProviderServ
     @Override
     @CheckForNull
     public Editor getIndexEditor(@Nonnull String type, @Nonnull NodeBuilder definition, 
-                    @Nonnull NodeState root) throws CommitFailedException {
+                    @Nonnull NodeState root, IndexUpdateCallback callback) throws CommitFailedException {
         Editor indexEditor = null;
         if (solrServerProvider != null && oakSolrConfigurationProvider != null && solrIndexEditorProvider == null) {
             solrIndexEditorProvider = new SolrIndexEditorProvider(solrServerProvider, oakSolrConfigurationProvider);
-            indexEditor = solrIndexEditorProvider.getIndexEditor(type, definition, root);
+            indexEditor = solrIndexEditorProvider.getIndexEditor(type, definition, root, callback);
         }
         return indexEditor;
     }