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


Reply via email to