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