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 ca...@apache.org on 2017/10/24 23:32:10 UTC
svn commit: r1813242 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdate.java
test/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdateTest.java
Author: catholicon
Date: Tue Oct 24 23:32:10 2017
New Revision: 1813242
URL: http://svn.apache.org/viewvc?rev=1813242&view=rev
Log:
OAK-6864: IndexUpdate should disable superseded indexes only during an async cycle run
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=1813242&r1=1813241&r2=1813242&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 Oct 24 23:32:10 2017
@@ -33,6 +33,7 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_PROPERTY_NAME;
import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_DISABLED;
import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.IndexUtils.getAsyncLaneName;
import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.MISSING_NODE;
import static org.apache.jackrabbit.oak.spi.commit.CompositeEditor.compose;
import static org.apache.jackrabbit.oak.spi.commit.EditorDiff.process;
@@ -292,7 +293,10 @@ public class IndexUpdate implements Edit
rootState.indexDisabler.markDisableFlagIfRequired(indexPath, definition);
} else {
- rootState.indexDisabler.disableOldIndexes(indexPath, definition);
+ // not async index OR we're indexing in async mode
+ if (getAsyncLaneName(definition.getNodeState(), indexPath) == null || rootState.async != null) {
+ rootState.indexDisabler.disableOldIndexes(indexPath, definition);
+ }
editors.add(editor);
}
}
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=1813242&r1=1813241&r2=1813242&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 Oct 24 23:32:10 2017
@@ -19,9 +19,11 @@ package org.apache.jackrabbit.oak.plugin
import static com.google.common.collect.Sets.newHashSet;
import static org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate.ASYNC;
import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.ASYNC_PROPERTY_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.DISABLE_INDEXES_ON_NEXT_CYCLE;
import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_CONTENT_NODE_NAME;
import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_PROPERTY_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.SUPERSEDED_INDEX_PATHS;
import static org.apache.jackrabbit.oak.plugins.index.IndexUtils.createIndexDefinition;
import static org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider.TYPE;
import static org.hamcrest.CoreMatchers.containsString;
@@ -77,6 +79,7 @@ import org.apache.jackrabbit.oak.spi.com
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
import org.apache.jackrabbit.oak.spi.commit.DefaultValidator;
import org.apache.jackrabbit.oak.spi.commit.Editor;
+import org.apache.jackrabbit.oak.spi.commit.EditorHook;
import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
import org.apache.jackrabbit.oak.spi.commit.Observer;
import org.apache.jackrabbit.oak.spi.commit.Validator;
@@ -1837,6 +1840,86 @@ public class AsyncIndexUpdateTest {
assertNotNull(indexStartTime);
}
+ // OAK-6864
+ @Test
+ public void disableSupersededIndex() throws Exception {
+ IndexEditorProvider propIdxEditorProvider = new PropertyIndexEditorProvider();
+ EditorHook propIdxHook = new EditorHook(new IndexUpdateProvider(propIdxEditorProvider));
+ MemoryNodeStore store = new MemoryNodeStore();
+
+ String supersededIndexName = "supersededIndex";
+ String supersedingIndexName = "supersedingIndex";
+
+ AsyncIndexUpdate async = new AsyncIndexUpdate("async", store, propIdxEditorProvider);
+
+ // Create superseded index def and merge it
+ NodeBuilder builder = store.getRoot().builder();
+ NodeBuilder oakIndex = builder.child(INDEX_DEFINITIONS_NAME);
+ createIndexDefinition(oakIndex, supersededIndexName, true, false, ImmutableSet.of("foo"), null);
+ store.merge(builder, propIdxHook, CommitInfo.EMPTY);
+
+ // Create superseding index def and merge it
+ builder = store.getRoot().builder();
+ oakIndex = builder.child(INDEX_DEFINITIONS_NAME);
+ createIndexDefinition(oakIndex, supersedingIndexName, true, false, ImmutableSet.of("foo"), null)
+ .setProperty(ASYNC_PROPERTY_NAME, ImmutableSet.of("async", "nrt"), Type.STRINGS)
+ .setProperty(SUPERSEDED_INDEX_PATHS, INDEX_DEFINITIONS_NAME + "/" + supersededIndexName)
+ ;
+ store.merge(builder, propIdxHook, CommitInfo.EMPTY);
+
+ // add a change and index it thought superseded index
+ builder = store.getRoot().builder();
+ builder.child("testNode1").setProperty("foo", "bar");
+ store.merge(builder, propIdxHook, CommitInfo.EMPTY);
+
+ // verify state
+ NodeState supersededIndex = store.getRoot().getChildNode(INDEX_DEFINITIONS_NAME).getChildNode(supersededIndexName);
+ assertEquals("Index disabled too early", "property", supersededIndex.getString("type"));
+ assertFalse("Don't set :disableIndexesOnNextCycle on superseded index",
+ supersededIndex.hasProperty(DISABLE_INDEXES_ON_NEXT_CYCLE));
+ NodeState supersedingIndex = store.getRoot().getChildNode(INDEX_DEFINITIONS_NAME).getChildNode(supersedingIndexName);
+ assertFalse("Don't set :disableIndexesOnNextCycle on superseding index just yet",
+ supersedingIndex.hasProperty(DISABLE_INDEXES_ON_NEXT_CYCLE));
+
+ // do an async run - this should reindex the superseding index
+ async.run();
+
+ // verify state
+ supersededIndex = store.getRoot().getChildNode(INDEX_DEFINITIONS_NAME).getChildNode(supersededIndexName);
+ assertEquals("Index disabled too early", "property", supersededIndex.getString("type"));
+ assertFalse("Don't set :disableIndexesOnNextCycle on superseded index",
+ supersededIndex.hasProperty(DISABLE_INDEXES_ON_NEXT_CYCLE));
+ supersedingIndex = store.getRoot().getChildNode(INDEX_DEFINITIONS_NAME).getChildNode(supersedingIndexName);
+ assertTrue(":disableIndexesOnNextCycle not set on superseding index after reindexing run",
+ supersedingIndex.hasProperty(DISABLE_INDEXES_ON_NEXT_CYCLE));
+
+ // add another change and index it thought superseded index
+ builder = store.getRoot().builder();
+ store.getRoot().builder().child("testNode2").setProperty("foo", "bar");
+ store.merge(builder, propIdxHook, CommitInfo.EMPTY);
+
+ // verify state
+ supersededIndex = store.getRoot().getChildNode(INDEX_DEFINITIONS_NAME).getChildNode(supersededIndexName);
+ assertEquals("Index disabled too early", "property", supersededIndex.getString("type"));
+ assertFalse("Don't set :disableIndexesOnNextCycle on superseded index",
+ supersededIndex.hasProperty(DISABLE_INDEXES_ON_NEXT_CYCLE));
+ supersedingIndex = store.getRoot().getChildNode(INDEX_DEFINITIONS_NAME).getChildNode(supersedingIndexName);
+ assertTrue(":disableIndexesOnNextCycle not set on superseding index after reindexing run",
+ supersedingIndex.getBoolean(DISABLE_INDEXES_ON_NEXT_CYCLE));
+
+ // do another async run - indexes should get disabled now
+ async.run();
+
+ // verify state
+ supersededIndex = store.getRoot().getChildNode(INDEX_DEFINITIONS_NAME).getChildNode(supersededIndexName);
+ assertEquals("Index yet not disabled", "disabled", supersededIndex.getString("type"));
+ assertFalse("Don't set :disableIndexesOnNextCycle on superseded index",
+ supersededIndex.hasProperty(DISABLE_INDEXES_ON_NEXT_CYCLE));
+ supersedingIndex = store.getRoot().getChildNode(INDEX_DEFINITIONS_NAME).getChildNode(supersedingIndexName);
+ assertFalse("Don't keep :disableIndexesOnNextCycle on superseding index after disabling",
+ supersedingIndex.hasProperty(DISABLE_INDEXES_ON_NEXT_CYCLE));
+ }
+
private static class TestIndexEditorProvider extends PropertyIndexEditorProvider {
private String indexPathToFail;
@Override