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();
     }