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