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 2016/08/04 09:48:17 UTC

svn commit: r1755167 - in /jackrabbit/oak/trunk/oak-lucene/src: main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ main/java/org/apache/jackrabbit/oak/plugins/index/lucene/reader/ test/java/org/apache/jackrabbit/oak/plugins/index/lucene/reader/

Author: chetanm
Date: Thu Aug  4 09:48:17 2016
New Revision: 1755167

URL: http://svn.apache.org/viewvc?rev=1755167&view=rev
Log:
OAK-4566 - Multiplexing store support in Lucene Indexes

Add support for creating multiple reader instances based on configured mounts in the system

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/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/reader/DefaultIndexReaderFactory.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/reader/DefaultIndexReaderFactoryTest.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=1755167&r1=1755166&r2=1755167&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 Aug  4 09:48:17 2016
@@ -42,6 +42,7 @@ import org.apache.jackrabbit.oak.spi.com
 import org.apache.jackrabbit.oak.spi.commit.Editor;
 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.NodeState;
 import org.apache.jackrabbit.oak.util.PerfLogger;
 import org.slf4j.Logger;
@@ -70,7 +71,7 @@ class IndexTracker {
     }
 
     IndexTracker(IndexCopier cloner){
-        this(new DefaultIndexReaderFactory(cloner));
+        this(new DefaultIndexReaderFactory(Mounts.defaultMountInfoProvider(), cloner));
     }
 
     IndexTracker(LuceneIndexReaderFactory readerFactory){

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=1755167&r1=1755166&r2=1755167&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 Thu Aug  4 09:48:17 2016
@@ -336,7 +336,7 @@ public class LuceneIndexProviderService
         if (enableCopyOnRead){
             initializeIndexCopier(bundleContext, config);
             log.info("Enabling CopyOnRead support. Index files would be copied under {}", indexDir.getAbsolutePath());
-            return new IndexTracker(new DefaultIndexReaderFactory(indexCopier));
+            return new IndexTracker(new DefaultIndexReaderFactory(mountInfoProvider, indexCopier));
         }
 
         return new IndexTracker();

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/reader/DefaultIndexReaderFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/reader/DefaultIndexReaderFactory.java?rev=1755167&r1=1755166&r2=1755167&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/reader/DefaultIndexReaderFactory.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/reader/DefaultIndexReaderFactory.java Thu Aug  4 09:48:17 2016
@@ -31,6 +31,9 @@ import com.google.common.collect.Immutab
 import org.apache.jackrabbit.oak.plugins.index.lucene.IndexCopier;
 import org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition;
 import org.apache.jackrabbit.oak.plugins.index.lucene.OakDirectory;
+import org.apache.jackrabbit.oak.plugins.index.lucene.writer.MultiplexersLucene;
+import org.apache.jackrabbit.oak.spi.mount.Mount;
+import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.ReadOnlyBuilder;
 import org.apache.lucene.store.Directory;
@@ -44,17 +47,46 @@ import static org.apache.jackrabbit.oak.
 
 public class DefaultIndexReaderFactory implements LuceneIndexReaderFactory {
     private final IndexCopier cloner;
+    private final MountInfoProvider mountInfoProvider;
 
-    public DefaultIndexReaderFactory(@Nullable IndexCopier cloner) {
+    public DefaultIndexReaderFactory(MountInfoProvider mountInfoProvider, @Nullable IndexCopier cloner) {
         this.cloner = cloner;
+        this.mountInfoProvider = mountInfoProvider;
     }
 
     @Override
     public List<LuceneIndexReader> createReaders(IndexDefinition definition, NodeState defnState,
                                                  String indexPath) throws IOException {
-        LuceneIndexReader reader = createReader(definition, defnState, indexPath,
-                INDEX_DATA_CHILD_NAME, SUGGEST_DATA_CHILD_NAME);
-        return reader != null ? ImmutableList.of(reader) : Collections.<LuceneIndexReader>emptyList();
+        if (!mountInfoProvider.hasNonDefaultMounts()) {
+            LuceneIndexReader reader = createReader(definition, defnState, indexPath,
+                    INDEX_DATA_CHILD_NAME, SUGGEST_DATA_CHILD_NAME);
+            return reader != null ? ImmutableList.of(reader) : Collections.<LuceneIndexReader>emptyList();
+        } else {
+            return createMountedReaders(definition, defnState, indexPath);
+        }
+    }
+
+    private List<LuceneIndexReader> createMountedReaders(IndexDefinition definition, NodeState defnState, String
+            indexPath) throws IOException {
+        ImmutableList.Builder<LuceneIndexReader> readers = ImmutableList.builder();
+        LuceneIndexReader reader = createReader(mountInfoProvider.getDefaultMount(), definition, defnState, indexPath);
+        if (reader != null) {
+            readers.add(reader);
+        }
+        for (Mount m : mountInfoProvider.getNonDefaultMounts()) {
+            reader = createReader(m, definition, defnState, indexPath);
+            if (reader != null) {
+                readers.add(reader);
+            }
+        }
+        return readers.build();
+    }
+
+    @CheckForNull
+    private LuceneIndexReader createReader(Mount mount, IndexDefinition definition, NodeState defnNodeState,
+                                           String indexPath) throws IOException {
+        return createReader(definition, defnNodeState, indexPath, MultiplexersLucene.getIndexDirName(mount),
+                MultiplexersLucene.getSuggestDirName(mount));
     }
 
     @CheckForNull

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/reader/DefaultIndexReaderFactoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/reader/DefaultIndexReaderFactoryTest.java?rev=1755167&r1=1755166&r2=1755167&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/reader/DefaultIndexReaderFactoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/reader/DefaultIndexReaderFactoryTest.java Thu Aug  4 09:48:17 2016
@@ -51,7 +51,7 @@ public class DefaultIndexReaderFactoryTe
 
     @Test
     public void emptyDir() throws Exception{
-        LuceneIndexReaderFactory factory = new DefaultIndexReaderFactory(null);
+        LuceneIndexReaderFactory factory = new DefaultIndexReaderFactory(mip, null);
         List<LuceneIndexReader> readers = factory.createReaders(defn, EMPTY_NODE,"/foo");
         assertTrue(readers.isEmpty());
     }
@@ -64,7 +64,7 @@ public class DefaultIndexReaderFactoryTe
         writer.updateDocument("/content/en", newDoc("/content/en"));
         writer.close(0);
 
-        LuceneIndexReaderFactory readerFactory = new DefaultIndexReaderFactory(null);
+        LuceneIndexReaderFactory readerFactory = new DefaultIndexReaderFactory(mip, null);
         List<LuceneIndexReader> readers = readerFactory.createReaders(defn, builder.getNodeState(),"/foo");
         assertEquals(1, readers.size());
 
@@ -100,7 +100,7 @@ public class DefaultIndexReaderFactoryTe
         writer.updateDocument("/content/en", doc);
         writer.close(0);
 
-        LuceneIndexReaderFactory readerFactory = new DefaultIndexReaderFactory(null);
+        LuceneIndexReaderFactory readerFactory = new DefaultIndexReaderFactory(mip, null);
         List<LuceneIndexReader> readers = readerFactory.createReaders(defn, builder.getNodeState(),"/foo");
         LuceneIndexReader reader = readers.get(0);
         assertNotNull(reader.getSearcher());
@@ -108,6 +108,46 @@ public class DefaultIndexReaderFactoryTe
         assertNotNull(reader.getLookup());
     }
 
+    @Test
+    public void multipleReaders() throws Exception{
+        LuceneIndexWriterFactory factory = new DefaultIndexWriterFactory(mip, null);
+        LuceneIndexWriter writer = factory.newInstance(defn, builder, true);
+
+        writer.updateDocument("/content/en", newDoc("/content/en"));
+        writer.updateDocument("/libs/config", newDoc("/libs/config"));
+        writer.close(0);
+
+        LuceneIndexReaderFactory readerFactory = new DefaultIndexReaderFactory(mip, null);
+        List<LuceneIndexReader> readers = readerFactory.createReaders(defn, builder.getNodeState(),"/foo");
+        assertEquals(2, readers.size());
+    }
+
+    @Test
+    public void multipleReaders_SingleSuggester() throws Exception{
+        LuceneIndexWriterFactory factory = new DefaultIndexWriterFactory(mip, null);
+        enabledSuggestorForSomeProp();
+        defn = new IndexDefinition(root, builder.getNodeState());
+        LuceneIndexWriter writer = factory.newInstance(defn, builder, true);
+
+        //Suggester field is only present for document in default mount
+        Document doc = newDoc("/content/en");
+        doc.add(new StringField(FieldNames.SUGGEST, "test", null));
+        writer.updateDocument("/content/en", doc);
+
+        writer.updateDocument("/libs/config", newDoc("/libs/config"));
+        writer.close(0);
+
+        LuceneIndexReaderFactory readerFactory = new DefaultIndexReaderFactory(mip, null);
+        List<LuceneIndexReader> readers = readerFactory.createReaders(defn, builder.getNodeState(),"/foo");
+
+        //Suggester should be present for all though it may be empty
+        for (LuceneIndexReader reader : readers){
+            assertNotNull(reader.getSearcher());
+            assertNotNull(reader.getSuggestDirectory());
+            assertNotNull(reader.getLookup());
+        }
+    }
+
     private void enabledSuggestorForSomeProp(){
         NodeBuilder prop = builder.child("indexRules").child("nt:base").child("properties").child("prop1");
         prop.setProperty("name", "foo");