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 ch...@apache.org on 2017/10/05 09:54:03 UTC
svn commit: r1811182 - in /jackrabbit/oak/trunk/oak-lucene/src:
main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTracker.java
test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java
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();
}