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/03 05:10:43 UTC

svn commit: r1810649 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/pro...

Author: chetanm
Date: Tue Oct  3 05:10:43 2017
New Revision: 1810649

URL: http://svn.apache.org/viewvc?rev=1810649&view=rev
Log:
OAK-6713 - AsyncIndexInfoService - Method to detect change in indexer state

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoService.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoServiceImpl.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoServiceImplTest.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleaner.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleanerTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoService.java?rev=1810649&r1=1810648&r2=1810649&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoService.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoService.java Tue Oct  3 05:10:43 2017
@@ -19,6 +19,8 @@
 
 package org.apache.jackrabbit.oak.plugins.index;
 
+import java.util.Map;
+
 import javax.annotation.CheckForNull;
 
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -52,4 +54,33 @@ public interface AsyncIndexInfoService {
      */
     @CheckForNull
     AsyncIndexInfo getInfo(String name, NodeState root);
+
+    /**
+     * Returns the lastIndexUpto time in millis for each indexing lane
+     * for current root state
+     *
+     * @return map with lane name as key and lastIndexUpto in millis as value
+     */
+    Map<String, Long> getIndexedUptoPerLane();
+
+    /**
+     * Returns the lastIndexUpto time in millis for each indexing lane
+     * for given root state
+     *
+     * @return map with lane name as key and lastIndexUpto in millis as value
+     */
+    Map<String, Long> getIndexedUptoPerLane(NodeState root);
+
+    /**
+     * Determines if any index lane has completed any indexing cycle between given
+     * two repository states
+     *
+     * @param before before state of root node
+     * @param after after state of root node
+     * @return true if any indexing lane has completed any indexing cycle i.e. its
+     * lastIndexTo time has changed
+     */
+    default boolean hasIndexerUpdatedForAnyLane(NodeState before, NodeState after) {
+        return !getIndexedUptoPerLane(before).equals(getIndexedUptoPerLane(after));
+    }
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoServiceImpl.java?rev=1810649&r1=1810648&r2=1810649&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoServiceImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoServiceImpl.java Tue Oct  3 05:10:43 2017
@@ -25,6 +25,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+import com.google.common.collect.ImmutableMap;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.api.jmx.IndexStatsMBean;
@@ -80,7 +81,7 @@ public class AsyncIndexInfoServiceImpl i
     public AsyncIndexInfo getInfo(String name, NodeState root) {
         NodeState async = getAsyncState(root);
         if (async.hasProperty(name)) {
-            long lastIndexedTo = getDateAsMillis(async.getProperty(AsyncIndexUpdate.lastIndexedTo(name)));
+            long lastIndexedTo = getLastIndexedTo(name, async);
             long leaseEnd = -1;
             boolean running = false;
             if (async.hasProperty(AsyncIndexUpdate.leasify(name))) {
@@ -93,6 +94,25 @@ public class AsyncIndexInfoServiceImpl i
         return null;
     }
 
+    @Override
+    public Map<String, Long> getIndexedUptoPerLane() {
+        return getIndexedUptoPerLane(nodeStore.getRoot());
+    }
+
+    @Override
+    public Map<String, Long> getIndexedUptoPerLane(NodeState root) {
+        ImmutableMap.Builder<String, Long> builder = new ImmutableMap.Builder<String, Long>();
+        NodeState async = getAsyncState(root);
+        for (PropertyState ps : async.getProperties()) {
+            String name = ps.getName();
+            if (AsyncIndexUpdate.isAsyncLaneName(name)) {
+                long lastIndexedTo = getLastIndexedTo(name, async);
+                builder.put(name, lastIndexedTo);
+            }
+        }
+        return builder.build();
+    }
+
     private NodeState getAsyncState(NodeState root) {
         return root.getChildNode(AsyncIndexUpdate.ASYNC);
     }
@@ -111,6 +131,10 @@ public class AsyncIndexInfoServiceImpl i
         statsMBeans.remove(mBean.getName());
     }
 
+    private static long getLastIndexedTo(String name, NodeState async) {
+        return getDateAsMillis(async.getProperty(AsyncIndexUpdate.lastIndexedTo(name)));
+    }
+
     private static long getDateAsMillis(PropertyState ps) {
         if (ps == null) {
             return -1;

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoServiceImplTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoServiceImplTest.java?rev=1810649&r1=1810648&r2=1810649&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoServiceImplTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexInfoServiceImplTest.java Tue Oct  3 05:10:43 2017
@@ -19,11 +19,16 @@
 
 package org.apache.jackrabbit.oak.plugins.index;
 
+import java.util.Map;
 import java.util.Set;
 
 import com.google.common.collect.ImmutableSet;
 import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.junit.Test;
 
 import static org.hamcrest.Matchers.containsInAnyOrder;
@@ -76,4 +81,37 @@ public class AsyncIndexInfoServiceImplTe
         assertNull(info2.getStatsMBean());
     }
 
+    @Test
+    public void indexedUpto() throws Exception{
+        AsyncIndexUpdate async = new AsyncIndexUpdate("async", store, provider);
+        async.run();
+
+        AsyncIndexUpdate async2 = new AsyncIndexUpdate("foo-async", store, provider);
+        async2.run();
+
+        Map<String, Long> result = service.getIndexedUptoPerLane();
+
+        assertFalse(result.isEmpty());
+        assertTrue(result.get("async") > -1);
+        assertTrue(result.get("foo-async") > -1);
+    }
+
+    @Test
+    public void asyncStateChanged() throws Exception{
+        AsyncIndexUpdate async = new AsyncIndexUpdate("async", store, provider);
+        async.run();
+
+        AsyncIndexUpdate async2 = new AsyncIndexUpdate("foo-async", store, provider);
+        async2.run();
+
+        NodeState root = store.getRoot();
+        assertFalse(service.hasIndexerUpdatedForAnyLane(root, root));
+
+        NodeBuilder builder = store.getRoot().builder();
+        builder.child(":async").setProperty(AsyncIndexUpdate.lastIndexedTo("async"), 42L);
+        store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+        assertTrue(service.hasIndexerUpdatedForAnyLane(root, store.getRoot()));
+    }
+
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleaner.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleaner.java?rev=1810649&r1=1810648&r2=1810649&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleaner.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleaner.java Tue Oct  3 05:10:43 2017
@@ -87,7 +87,7 @@ public class PropertyIndexCleaner implem
      */
     public boolean performCleanup() throws CommitFailedException {
         Stopwatch w = Stopwatch.createStarted();
-        Map<String, Long> asyncInfo = getAsyncInfo();
+        Map<String, Long> asyncInfo = asyncIndexInfoService.getIndexedUptoPerLane();
         if (lastAsyncInfo.equals(asyncInfo)) {
             log.debug("No change found in async state from last run {}. Skipping the run", asyncInfo);
             return false;
@@ -231,19 +231,6 @@ public class PropertyIndexCleaner implem
         nodeStore.merge(builder, EmptyHook.INSTANCE, createCommitInfo());
     }
 
-    private Map<String, Long> getAsyncInfo() {
-        Map<String, Long> infos = new HashMap<>();
-        for (String asyncLane : asyncIndexInfoService.getAsyncLanes()) {
-            AsyncIndexInfo info = asyncIndexInfoService.getInfo(asyncLane);
-            if (info != null) {
-                infos.put(asyncLane, info.getLastIndexedTo());
-            } else {
-                log.warn("No AsyncIndexInfo found for lane name [{}]", asyncLane);
-            }
-        }
-        return infos;
-    }
-
     private static CommitInfo createCommitInfo() {
         Map<String, Object> info = ImmutableMap.of(CommitContext.NAME, new SimpleCommitContext());
         return new CommitInfo(CommitInfo.OAK_UNKNOWN, CommitInfo.OAK_UNKNOWN, info);

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleanerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleanerTest.java?rev=1810649&r1=1810648&r2=1810649&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleanerTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleanerTest.java Tue Oct  3 05:10:43 2017
@@ -285,6 +285,20 @@ public class PropertyIndexCleanerTest {
             return null;
         }
 
+        @Override
+        public Map<String, Long> getIndexedUptoPerLane() {
+            Map<String, Long> result = new HashMap<>();
+            for (AsyncIndexInfo info : infos.values()) {
+                result.put(info.getName(), info.getLastIndexedTo());
+            }
+            return result;
+        }
+
+        @Override
+        public Map<String, Long> getIndexedUptoPerLane(NodeState root) {
+            throw new UnsupportedOperationException();
+        }
+
         public void addInfo(String name, long lastIndexedTo) {
             infos.put(name, new AsyncIndexInfo(name, lastIndexedTo, 0, false, null));
         }