Author: chetanm
Date: Tue Oct 3 05:10:58 2017
New Revision: 1810650
URL: http://svn.apache.org/viewvc?rev=1810650&view=rev
Log:
OAK-6535 - Synchronous Lucene Property Indexes
Avoid redundant diff if no async indexer state change has occurred
This is specially useful with property index integration as now
index nodes do get changed with every commit but actual persisted
index content does not change. Without that IndexTracker would unnecessarily
reopen the indexes and would also lead to loss of NRTIndex populated
so far
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTracker.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexTrackerTest.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderServiceTest.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=1810650&r1=1810649&r2=1810650&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
Tue Oct 3 05:10:58 2017
@@ -39,6 +39,7 @@ import javax.annotation.Nullable;
import com.google.common.collect.Sets;
import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.plugins.index.AsyncIndexInfoService;
import org.apache.jackrabbit.oak.plugins.index.lucene.hybrid.NRTIndexFactory;
import
org.apache.jackrabbit.oak.plugins.index.lucene.reader.DefaultIndexReaderFactory;
import
org.apache.jackrabbit.oak.plugins.index.lucene.reader.LuceneIndexReaderFactory;
@@ -69,6 +70,8 @@ public class IndexTracker {
private NodeState root = EMPTY_NODE;
+ private AsyncIndexInfoService asyncIndexInfoService;
+
private volatile Map<String, IndexNodeManager> indices = emptyMap();
private volatile boolean refresh;
@@ -114,7 +117,21 @@ public class IndexTracker {
}
}
+ public void setAsyncIndexInfoService(AsyncIndexInfoService
asyncIndexInfoService) {
+ this.asyncIndexInfoService = asyncIndexInfoService;
+ }
+
+ AsyncIndexInfoService getAsyncIndexInfoService() {
+ return asyncIndexInfoService;
+ }
+
private synchronized void diffAndUpdate(final NodeState root) {
+ if (asyncIndexInfoService != null &&
!asyncIndexInfoService.hasIndexerUpdatedForAnyLane(this.root, root)) {
+ log.trace("No changed detected in async indexer state. Skipping
further diff");
+ this.root = root;
+ return;
+ }
+
Map<String, IndexNodeManager> original = indices;
final Map<String, IndexNodeManager> updates = newHashMap();
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java?rev=1810650&r1=1810649&r2=1810650&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
Tue Oct 3 05:10:58 2017
@@ -343,6 +343,8 @@ public class LuceneIndexProviderService
private LuceneIndexEditorProvider editorProvider;
+ private IndexTracker tracker;
+
@Activate
private void activate(BundleContext bundleContext, Map<String, ?> config)
throws NotCompliantMBeanException, IOException {
@@ -369,7 +371,7 @@ public class LuceneIndexProviderService
threadPoolSize =
PropertiesUtil.toInteger(config.get(PROP_THREAD_POOL_SIZE),
PROP_THREAD_POOL_SIZE_DEFAULT);
initializeIndexDir(bundleContext, config);
initializeExtractedTextCache(bundleContext, config);
- IndexTracker tracker = createTracker(bundleContext, config);
+ tracker = createTracker(bundleContext, config);
indexProvider = new LuceneIndexProvider(tracker, scorerFactory,
augmentorFactory);
initializeActiveBlobCollector(whiteboard, config);
initializeLogging(config);
@@ -512,16 +514,20 @@ public class LuceneIndexProviderService
private IndexTracker createTracker(BundleContext bundleContext,
Map<String, ?> config) throws IOException {
boolean enableCopyOnRead =
PropertiesUtil.toBoolean(config.get(PROP_COPY_ON_READ), true);
+ IndexTracker tracker;
if (enableCopyOnRead){
initializeIndexCopier(bundleContext, config);
log.info("Enabling CopyOnRead support. Index files would be copied
under {}", indexDir.getAbsolutePath());
if (hybridIndex) {
nrtIndexFactory = new NRTIndexFactory(indexCopier,
statisticsProvider);
}
- return new IndexTracker(new
DefaultIndexReaderFactory(mountInfoProvider, indexCopier), nrtIndexFactory);
+ tracker = new IndexTracker(new
DefaultIndexReaderFactory(mountInfoProvider, indexCopier), nrtIndexFactory);
+ } else {
+ tracker = new IndexTracker();
}
- return new IndexTracker();
+ tracker.setAsyncIndexInfoService(asyncIndexInfoService);
+ return tracker;
}
private void initializeIndexCopier(BundleContext bundleContext,
Map<String, ?> config) throws IOException {
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=1810650&r1=1810649&r2=1810650&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
Tue Oct 3 05:10:58 2017
@@ -26,6 +26,7 @@ import com.google.common.collect.Immutab
import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.plugins.index.AsyncIndexInfoService;
import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
import org.apache.jackrabbit.oak.plugins.index.TrackingCorruptIndexHandler;
import org.apache.jackrabbit.oak.plugins.memory.ArrayBasedBlob;
@@ -47,6 +48,9 @@ import static org.junit.Assert.assertNot
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
@SuppressWarnings("UnusedAssignment")
public class IndexTrackerTest {
@@ -203,6 +207,50 @@ public class IndexTrackerTest {
assertTrue(corruptIndexHandler.getFailingIndexData("async").containsKey("/oak:index/foo"));
}
+
+ @Test
+ public void avoidRedundantDiff() throws Exception{
+ IndexTracker tracker2 = new IndexTracker();
+
+ 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);
+
+ tracker.update(indexed);
+ tracker2.update(indexed);
+
+ IndexNode indexNode = tracker.acquireIndexNode("/oak:index/lucene");
+ assertEquals(1, indexNode.getSearcher().getIndexReader().numDocs());
+ indexNode.release();
+
+ before = indexed;
+ builder = before.builder();
+ builder.child("a").setProperty("foo", "bar");
+ after = builder.getNodeState();
+
+ AsyncIndexInfoService service = mock(AsyncIndexInfoService.class);
+ when(service.hasIndexerUpdatedForAnyLane(any(NodeState.class),
any(NodeState.class))).thenReturn(false);
+ tracker.setAsyncIndexInfoService(service);
+
+ indexed = hook.processCommit(before, after, CommitInfo.EMPTY);
+ tracker.update(indexed);
+ tracker2.update(indexed);
+
+ //As we falsely said no change has happened index state would remain
same
+ indexNode = tracker.acquireIndexNode("/oak:index/lucene");
+ assertEquals(1, indexNode.getSearcher().getIndexReader().numDocs());
+ indexNode.release();
+
+ //While tracker2 does not use async service it sees the index change
+ indexNode = tracker2.acquireIndexNode("/oak:index/lucene");
+ assertEquals(2, indexNode.getSearcher().getIndexReader().numDocs());
+ indexNode.release();
+ }
private NodeState corruptIndex(String indexPath) {
NodeBuilder dir = TestUtil.child(builder, PathUtils.concat(indexPath,
":data"));
Modified:
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderServiceTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderServiceTest.java?rev=1810650&r1=1810649&r2=1810650&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderServiceTest.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderServiceTest.java
Tue Oct 3 05:10:58 2017
@@ -144,6 +144,9 @@ public class LuceneIndexProviderServiceT
assertNotNull(WhiteboardUtils.getServices(wb, Runnable.class, r -> r
instanceof PropertyIndexCleaner));
MockOsgi.deactivate(service, context.bundleContext());
+
+ IndexTracker tracker = (IndexTracker)
FieldUtils.readDeclaredField(service, "tracker", true);
+ assertNotNull(tracker.getAsyncIndexInfoService());
}
@Test