Author: chetanm Date: Thu Oct 5 09:54:02 2017 New Revision: 1811182 URL: http://svn.apache.org/viewvc?rev=1811182&view=rev Log: OAK-6779 - IndexTracker should check diff on :status node to detect index updates
Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTracker.java jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTracker.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTracker.java?rev=1811182&r1=1811181&r2=1811182&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTracker.java (original) +++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTracker.java Thu Oct 5 09:54:02 2017 @@ -25,6 +25,9 @@ import static com.google.common.collect. import static com.google.common.collect.Maps.filterValues; import static com.google.common.collect.Maps.newHashMap; import static java.util.Collections.emptyMap; +import static org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition.INDEX_DEFINITION_NODE; +import static org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition.STATUS_NODE; +import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PROP_REFRESH_DEFN; import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.TYPE_LUCENE; import static org.apache.jackrabbit.oak.plugins.index.lucene.util.LuceneIndexHelper.isLuceneIndexNode; import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE; @@ -49,8 +52,10 @@ import org.apache.jackrabbit.oak.spi.com import org.apache.jackrabbit.oak.spi.commit.EditorDiff; import org.apache.jackrabbit.oak.spi.commit.SubtreeEditor; import org.apache.jackrabbit.oak.spi.mount.Mounts; +import org.apache.jackrabbit.oak.spi.state.EqualsDiff; import org.apache.jackrabbit.oak.spi.state.NodeState; import org.apache.jackrabbit.oak.commons.benchmark.PerfLogger; +import org.apache.jackrabbit.oak.spi.state.NodeStateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -145,10 +150,12 @@ public class IndexTracker { @Override public void leave(NodeState before, NodeState after) { try { - long start = PERF_LOGGER.start(); - IndexNodeManager index = IndexNodeManager.open(path, root, after, readerFactory, nrtFactory); - PERF_LOGGER.end(start, -1, "[{}] Index found to be updated. Reopening the IndexNode", path); - updates.put(path, index); // index can be null + if (isStatusChanged(before, after) || isIndexDefinitionChanged(before, after)) { + long start = PERF_LOGGER.start(); + IndexNodeManager index = IndexNodeManager.open(path, root, after, readerFactory, nrtFactory); + PERF_LOGGER.end(start, -1, "[{}] Index found to be updated. Reopening the IndexNode", path); + updates.put(path, index); // index can be null + } } catch (IOException e) { badIndexTracker.markBadPersistedIndex(path, e); } @@ -263,5 +270,11 @@ public class IndexTracker { return null; } + private static boolean isStatusChanged(NodeState before, NodeState after) { + return !EqualsDiff.equals(before.getChildNode(STATUS_NODE), after.getChildNode(STATUS_NODE)); + } + private static boolean isIndexDefinitionChanged(NodeState before, NodeState after) { + return !EqualsDiff.equals(before.getChildNode(INDEX_DEFINITION_NODE), after.getChildNode(INDEX_DEFINITION_NODE)); + } } Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java?rev=1811182&r1=1811181&r2=1811182&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java (original) +++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java Thu Oct 5 09:54:02 2017 @@ -30,6 +30,7 @@ import org.apache.jackrabbit.oak.plugins import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider; import org.apache.jackrabbit.oak.plugins.index.TrackingCorruptIndexHandler; import org.apache.jackrabbit.oak.plugins.memory.ArrayBasedBlob; +import org.apache.jackrabbit.oak.plugins.memory.ModifiedNodeState; import org.apache.jackrabbit.oak.plugins.memory.PropertyStates; import org.apache.jackrabbit.oak.spi.commit.CommitInfo; import org.apache.jackrabbit.oak.spi.commit.EditorHook; @@ -40,6 +41,7 @@ import org.junit.Before; import org.junit.Test; import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME; +import static org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition.STATUS_NODE; import static org.apache.jackrabbit.oak.plugins.index.lucene.util.LuceneIndexHelper.newLucenePropertyIndexDefinition; import static org.apache.jackrabbit.oak.InitialContent.INITIAL_CONTENT; import static org.junit.Assert.assertEquals; @@ -252,6 +254,40 @@ public class IndexTrackerTest { indexNode.release(); } + @Test + public void avoidNonStatusChanges() throws Exception{ + + NodeBuilder index = builder.child(INDEX_DEFINITIONS_NAME); + newLucenePropertyIndexDefinition(index, "lucene", ImmutableSet.of("foo"), "async"); + + NodeState before = builder.getNodeState(); + builder.setProperty("foo", "bar"); + NodeState after = builder.getNodeState(); + + NodeState indexed = hook.processCommit(before, after, CommitInfo.EMPTY); + + indexed = ModifiedNodeState.squeeze(indexed); + tracker.update(indexed); + + IndexNode indexNode = tracker.acquireIndexNode("/oak:index/lucene"); + int indexNodeId = indexNode.getIndexNodeId(); + indexNode.release(); + + before = indexed; + builder = before.builder(); + TestUtil.child(builder, "/oak:index/lucene/:property-index").setProperty("foo", "bar"); + after = builder.getNodeState(); + indexed = ModifiedNodeState.squeeze(after); + + tracker.update(indexed); + + indexNode = tracker.acquireIndexNode("/oak:index/lucene"); + int indexNodeId2 = indexNode.getIndexNodeId(); + indexNode.release(); + + assertEquals(indexNodeId, indexNodeId2); + } + private NodeState corruptIndex(String indexPath) { NodeBuilder dir = TestUtil.child(builder, PathUtils.concat(indexPath, ":data")); for (String name : dir.getChildNodeNames()){ @@ -260,6 +296,8 @@ public class IndexTrackerTest { .singletonList(new ArrayBasedBlob("foo".getBytes())), Type.BINARIES)); } } + + TestUtil.child(builder, PathUtils.concat(indexPath, IndexDefinition.STATUS_NODE)).setProperty("foo", "bar"); return builder.getNodeState(); }