Author: chetanm
Date: Tue Nov 29 05:58:44 2016
New Revision: 1771844

URL: http://svn.apache.org/viewvc?rev=1771844&view=rev
Log:
OAK-5177 - Non default MissingIndexProviderStrategy is not being passed to 
child editor

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdate.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdateTest.java

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=1771844&r1=1771843&r2=1771844&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
 Tue Nov 29 05:58:44 2016
@@ -122,7 +122,6 @@ public class IndexUpdate implements Edit
      */
     private final Map<String, Editor> reindex = new HashMap<String, Editor>();
 
-    private MissingIndexProviderStrategy missingProvider = new 
MissingIndexProviderStrategy();
 
     public IndexUpdate(
             IndexEditorProvider provider, String async,
@@ -235,7 +234,7 @@ public class IndexUpdate implements Edit
                 Editor editor = rootState.provider.getIndexEditor(type, 
definition, rootState.root,
                         rootState.newCallback(indexPath, shouldReindex));
                 if (editor == null) {
-                    missingProvider.onMissingIndex(type, definition, 
indexPath);
+                    rootState.missingProvider.onMissingIndex(type, definition, 
indexPath);
                 } else if (shouldReindex) {
                     if (definition.getBoolean(REINDEX_ASYNC_PROPERTY_NAME)
                             && definition.getString(ASYNC_PROPERTY_NAME) == 
null) {
@@ -464,7 +463,7 @@ public class IndexUpdate implements Edit
 
     public IndexUpdate withMissingProviderStrategy(
             MissingIndexProviderStrategy missingProvider) {
-        this.missingProvider = missingProvider;
+        rootState.setMissingProvider(missingProvider);
         return this;
     }
 
@@ -482,6 +481,7 @@ public class IndexUpdate implements Edit
         final CorruptIndexHandler corruptIndexHandler;
         private int changedNodeCount;
         private int changedPropertyCount;
+        private MissingIndexProviderStrategy missingProvider = new 
MissingIndexProviderStrategy();
 
         private IndexUpdateRootState(IndexEditorProvider provider, String 
async, NodeState root,
                                      IndexUpdateCallback updateCallback, 
CommitInfo commitInfo, CorruptIndexHandler corruptIndexHandler) {
@@ -558,6 +558,10 @@ public class IndexUpdate implements Edit
                     changedNodeCount, changedPropertyCount);
         }
 
+        public void setMissingProvider(MissingIndexProviderStrategy 
missingProvider) {
+            this.missingProvider = missingProvider;
+        }
+
         private class CountingCallback implements ContextAwareCallback, 
IndexingContext {
             final String indexPath;
             final boolean reindex;

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=1771844&r1=1771843&r2=1771844&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
 Tue Nov 29 05:58:44 2016
@@ -85,6 +85,7 @@ import org.apache.jackrabbit.oak.spi.que
 import org.apache.jackrabbit.oak.spi.state.ConflictAnnotatingRebaseDiff;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStateUtils;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.spi.state.ProxyNodeStore;
 import org.apache.jackrabbit.oak.stats.Clock;
@@ -835,6 +836,51 @@ public class AsyncIndexUpdateTest {
                         .getString("asyncMissing"));
     }
 
+    @Test
+    public void testReindexMissingProvider_NonRoot() throws Exception {
+        MemoryNodeStore store = new MemoryNodeStore();
+        IndexEditorProvider provider = new PropertyIndexEditorProvider();
+
+        NodeBuilder builder = store.getRoot().builder();
+        
createIndexDefinition(builder.child("subNodeIndex").child(INDEX_DEFINITIONS_NAME),
+                "rootIndex2", true, false, ImmutableSet.of("foo"), null)
+                .setProperty(ASYNC_PROPERTY_NAME, "asyncMissing");
+
+        builder.child("subNodeIndex").child("testRoot").setProperty("foo", 
"abc");
+        store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+        AsyncIndexUpdate async = new AsyncIndexUpdate("asyncMissing", store,  
provider);
+        //first run, creates a checkpoint and a ref to it as the last indexed 
state
+        async.run();
+        assertFalse(async.isFailing());
+
+        assertTrue("Expecting one checkpoint",
+                store.listCheckpoints().size() == 1);
+        String firstCp = store.listCheckpoints().iterator().next();
+        assertEquals(firstCp, 
store.getRoot().getChildNode(ASYNC).getString("asyncMissing"));
+
+        builder = store.getRoot().builder();
+        builder.child("subNodeIndex").child("testRoot2").setProperty("foo", 
"abc");
+        store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+        // second run, simulate an index going away
+        provider = CompositeIndexEditorProvider.compose(new 
ArrayList<IndexEditorProvider>());
+        async = new AsyncIndexUpdate("asyncMissing", store, provider);
+        async.run();
+        assertTrue(async.isFailing());
+        // don't set reindex=true but skip the update
+        NodeState rootIndex2 = NodeStateUtils.getNode(store.getRoot(), 
"/subNodeIndex/oak:index/rootIndex2");
+        assertTrue(rootIndex2.exists());
+
+        PropertyState reindex2 = rootIndex2.getProperty(REINDEX_PROPERTY_NAME);
+        assertTrue(reindex2 == null || !reindex2.getValue(Type.BOOLEAN));
+
+        assertTrue("Expecting one checkpoint",store.listCheckpoints().size() 
== 1);
+        String secondCp = store.listCheckpoints().iterator().next();
+        assertTrue("Store should not create a new checkpoint",  
secondCp.equals(firstCp));
+        assertEquals(firstCp, 
store.getRoot().getChildNode(ASYNC).getString("asyncMissing"));
+    }
+
     private static class FaultyIndexEditorProvder implements
             IndexEditorProvider {
 


Reply via email to