diff --git a/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticBenchmarkRunner.java b/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticBenchmarkRunner.java index 48c2506..2fea1c9 100644 --- a/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticBenchmarkRunner.java +++ b/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticBenchmarkRunner.java @@ -37,7 +37,7 @@ public class ElasticBenchmarkRunner extends BenchmarkRunner { try { coordinate = new ElasticsearchConnection(benchmarkOptions.getElasticScheme().value(options), - benchmarkOptions.getElasticHost().value(options), benchmarkOptions.getElasticPort().value(options)); + benchmarkOptions.getElasticHost().value(options), benchmarkOptions.getElasticPort().value(options), "Benchmark"); BenchmarkRunner.addToBenchMarkList( Arrays.asList( diff --git a/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticFullTextWithGlobalIndexSearchTest.java b/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticFullTextWithGlobalIndexSearchTest.java index 7297544..5f3b0fe 100644 --- a/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticFullTextWithGlobalIndexSearchTest.java +++ b/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticFullTextWithGlobalIndexSearchTest.java @@ -40,7 +40,7 @@ import java.io.File; public class ElasticFullTextWithGlobalIndexSearchTest extends SearchTest { private ElasticsearchConnection coordinate; - private final String ELASTIC_GLOBAL_INDEX = "elasticGlobal"; + private final String ELASTIC_GLOBAL_INDEX = "elasticGlobal" + System.nanoTime(); public ElasticFullTextWithGlobalIndexSearchTest(File dump, boolean flat, boolean doReport, Boolean storageEnabled, ElasticsearchConnection coordinate) { super(dump, flat, doReport, storageEnabled); diff --git a/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticFullTextWithoutGlobalIndexSearchTest.java b/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticFullTextWithoutGlobalIndexSearchTest.java index 9c70d25..26f05c8 100644 --- a/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticFullTextWithoutGlobalIndexSearchTest.java +++ b/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticFullTextWithoutGlobalIndexSearchTest.java @@ -60,7 +60,7 @@ public class ElasticFullTextWithoutGlobalIndexSearchTest extends SearchTest { .with(indexProvider) .with(new PropertyIndexEditorProvider()) .with(new NodeTypeIndexProvider()) - .with(new PropertyFullTextTest.FullTextPropertyInitialiser("elasticText", of("text"), + .with(new PropertyFullTextTest.FullTextPropertyInitialiser("elasticText" + System.nanoTime(), of("text"), ElasticsearchIndexDefinition.TYPE_ELASTICSEARCH).nodeScope().analyzed()); return new Jcr(oak); } diff --git a/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticPropertyFTIndexedContentAvailability.java b/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticPropertyFTIndexedContentAvailability.java index ed170de..a9d5f05 100644 --- a/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticPropertyFTIndexedContentAvailability.java +++ b/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticPropertyFTIndexedContentAvailability.java @@ -66,7 +66,7 @@ public class ElasticPropertyFTIndexedContentAvailability extends PropertyFullTex private static final Logger LOG = LoggerFactory.getLogger(ElasticPropertyFTIndexedContentAvailability.class); private String currentFixtureName; private ElasticsearchConnection coordinate; - private final String ELASTIC_GLOBAL_INDEX = "elasticGlobal"; + private final String ELASTIC_GLOBAL_INDEX = "elasticGlobal" + System.nanoTime(); @Override public String getCurrentFixtureName() { @@ -101,7 +101,7 @@ public class ElasticPropertyFTIndexedContentAvailability extends PropertyFullTex .with(indexProvider) .with((new ElasticGlobalInitializer(ELASTIC_GLOBAL_INDEX, storageEnabled)).async()) // the WikipediaImporter set a property `title` - .with(new FullTextPropertyInitialiser("elasticTitle", of("title"), + .with(new FullTextPropertyInitialiser("elasticTitle" + System.nanoTime(), of("title"), ElasticsearchIndexDefinition.TYPE_ELASTICSEARCH).async()) .withAsyncIndexing("async", 5); return new Jcr(oak); diff --git a/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticPropertyFTSeparatedIndexedContentAvailability.java b/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticPropertyFTSeparatedIndexedContentAvailability.java index bed5c57..2c77c46 100644 --- a/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticPropertyFTSeparatedIndexedContentAvailability.java +++ b/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticPropertyFTSeparatedIndexedContentAvailability.java @@ -45,7 +45,7 @@ public class ElasticPropertyFTSeparatedIndexedContentAvailability extends Proper private String currentFixtureName; private ElasticsearchConnection coordinate; - private final String ELASTIC_GLOBAL_INDEX = "elasticGlobal"; + private final String ELASTIC_GLOBAL_INDEX = "elasticGlobal" + System.nanoTime(); public ElasticPropertyFTSeparatedIndexedContentAvailability(final File dump, final boolean flat, @@ -79,7 +79,7 @@ public class ElasticPropertyFTSeparatedIndexedContentAvailability extends Proper .with(indexProvider) .with((new ElasticGlobalInitializer(ELASTIC_GLOBAL_INDEX, storageEnabled)).async("fulltext-async")) // the WikipediaImporter set a property `title` - .with(new FullTextPropertyInitialiser("elasticTitle", of("title"), + .with(new FullTextPropertyInitialiser("elasticTitle" + System.nanoTime(), of("title"), ElasticsearchIndexDefinition.TYPE_ELASTICSEARCH).async()) .withAsyncIndexing("async", 5) .withAsyncIndexing("fulltext-async", 5); diff --git a/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticPropertyTextSearchTest.java b/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticPropertyTextSearchTest.java index e74d013..7f84610 100644 --- a/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticPropertyTextSearchTest.java +++ b/oak-benchmarks-elastic/src/main/java/org/apache/jackrabbit/oak/benchmark/ElasticPropertyTextSearchTest.java @@ -76,7 +76,7 @@ public class ElasticPropertyTextSearchTest extends SearchTest { .with(indexProvider) .with(new PropertyIndexEditorProvider()) .with(new NodeTypeIndexProvider()) - .with(new PropertyFullTextTest.FullTextPropertyInitialiser("elasticTitle", of("title"), + .with(new PropertyFullTextTest.FullTextPropertyInitialiser("elasticTitle" + System.nanoTime(), of("title"), ElasticsearchIndexDefinition.TYPE_ELASTICSEARCH)); return new Jcr(oak); } diff --git a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java index babc782..d4ec221 100644 --- a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java +++ b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchConnection.java @@ -45,23 +45,25 @@ public class ElasticsearchConnection implements Closeable { protected static final int DEFAULT_PORT = 9200; protected static final Supplier defaultConnection = () -> - new ElasticsearchConnection(DEFAULT_SCHEME, DEFAULT_HOST, DEFAULT_PORT); + new ElasticsearchConnection(DEFAULT_SCHEME, DEFAULT_HOST, DEFAULT_PORT, "elastic"); private String scheme; private String host; private int port; + private final String indexPrefix; private volatile RestHighLevelClient client; private AtomicBoolean isClosed = new AtomicBoolean(false); - public ElasticsearchConnection(String scheme, String host, Integer port) { - if (scheme == null || host == null || port == null) { + public ElasticsearchConnection(String scheme, String host, Integer port, String indexPrefix) { + if (scheme == null || host == null || port == null || indexPrefix == null) { throw new IllegalArgumentException(); } this.scheme = scheme; this.host = host; this.port = port; + this.indexPrefix = indexPrefix; } public RestHighLevelClient getClient() { @@ -92,6 +94,10 @@ public class ElasticsearchConnection implements Closeable { return port; } + public String getIndexPrefix() { + return indexPrefix; + } + @Override public synchronized void close() throws IOException { if (client != null) { diff --git a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchIndexDefinition.java b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchIndexDefinition.java index 525d058..b2abf04 100644 --- a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchIndexDefinition.java +++ b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchIndexDefinition.java @@ -62,11 +62,12 @@ public class ElasticsearchIndexDefinition extends IndexDefinition { public final long bulkFlushIntervalMs; public final int bulkRetries; public final long bulkRetriesBackoff; + private final String indexPrefix; - public ElasticsearchIndexDefinition(NodeState root, NodeState defn, String indexPath) { + public ElasticsearchIndexDefinition(NodeState root, NodeState defn, String indexPath, String indexPrefix) { super(root, getIndexDefinitionState(defn), determineIndexFormatVersion(defn), determineUniqueId(defn), indexPath); + this.indexPrefix = indexPrefix != null ? indexPrefix : ""; this.remoteIndexName = setupIndexName(); - this.bulkActions = getOptionalValue(defn, BULK_ACTIONS, BULK_ACTIONS_DEFAULT); this.bulkSizeBytes = getOptionalValue(defn, BULK_SIZE_BYTES, BULK_SIZE_BYTES_DEFAULT); this.bulkFlushIntervalMs = getOptionalValue(defn, BULK_FLUSH_INTERVAL_MS, BULK_FLUSH_INTERVAL_MS_DEFAULT); @@ -85,7 +86,7 @@ public class ElasticsearchIndexDefinition extends IndexDefinition { private String setupIndexName() { // TODO: implement advanced remote index name strategy that takes into account multiple tenants and re-index process - return getESSafeIndexName(getIndexPath() + "-" + getReindexCount()); + return getESSafeIndexName(indexPrefix + getIndexPath() + "-" + getReindexCount()); } /** @@ -124,6 +125,13 @@ public class ElasticsearchIndexDefinition extends IndexDefinition { * The built object represents the index definition only without the node structure. */ public static class Builder extends IndexDefinition.Builder { + + private final String indexPrefix; + + public Builder(String indexPrefix) { + this.indexPrefix = indexPrefix; + } + @Override public ElasticsearchIndexDefinition build() { return (ElasticsearchIndexDefinition) super.build(); @@ -137,7 +145,7 @@ public class ElasticsearchIndexDefinition extends IndexDefinition { @Override protected IndexDefinition createInstance(NodeState indexDefnStateToUse) { - return new ElasticsearchIndexDefinition(root, indexDefnStateToUse, indexPath); + return new ElasticsearchIndexDefinition(root, indexDefnStateToUse, indexPath, indexPrefix); } } } diff --git a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchIndexProviderService.java b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchIndexProviderService.java index 1870699..feab286 100644 --- a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchIndexProviderService.java +++ b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchIndexProviderService.java @@ -89,6 +89,14 @@ public class ElasticsearchIndexProviderService { ) private static final String PROP_PRE_EXTRACTED_TEXT_ALWAYS_USE = "alwaysUsePreExtractedCache"; + private static final String PROP_INDEX_PREFIX_DEFAULT = ""; + @Property( + value = PROP_INDEX_PREFIX_DEFAULT, + label = "Index prefix", + description = "Prefix to be added to name of each elastic search index" + ) + static final String PROP_INDEX_PREFIX = "indexPrefix"; + @Property( value = ElasticsearchConnection.DEFAULT_SCHEME, label = "Elasticsearch connection scheme" @@ -265,7 +273,7 @@ public class ElasticsearchIndexProviderService { try { Integer port = Integer.parseInt(p.toString()); coordinate = new ElasticsearchConnection((String) config.get(PROP_ELASTICSEARCH_SCHEME), - (String) config.get(PROP_ELASTICSEARCH_HOST), port); + (String) config.get(PROP_ELASTICSEARCH_HOST), port, (String) config.get(PROP_INDEX_PREFIX)); } catch (NumberFormatException nfe) { LOG.warn("{} value ({}) cannot be parsed to a valid number", PROP_ELASTICSEARCH_PORT, p); } diff --git a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/index/ElasticsearchIndexEditorContext.java b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/index/ElasticsearchIndexEditorContext.java index aedb5f0..3f8e3a6 100644 --- a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/index/ElasticsearchIndexEditorContext.java +++ b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/index/ElasticsearchIndexEditorContext.java @@ -31,19 +31,22 @@ import java.io.IOException; class ElasticsearchIndexEditorContext extends FulltextIndexEditorContext { + private String indexPrefix; + ElasticsearchIndexEditorContext(NodeState root, NodeBuilder definition, @Nullable IndexDefinition indexDefinition, IndexUpdateCallback updateCallback, ElasticsearchIndexWriterFactory indexWriterFactory, ExtractedTextCache extractedTextCache, IndexingContext indexingContext, - boolean asyncIndexing) { + boolean asyncIndexing, String indexPrefix) { super(root, definition, indexDefinition, updateCallback, indexWriterFactory, extractedTextCache, indexingContext, asyncIndexing); + this.indexPrefix = indexPrefix; } @Override public IndexDefinition.Builder newDefinitionBuilder() { - return new ElasticsearchIndexDefinition.Builder(); + return new ElasticsearchIndexDefinition.Builder(indexPrefix); } @Override diff --git a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/index/ElasticsearchIndexEditorProvider.java b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/index/ElasticsearchIndexEditorProvider.java index 777722e..7976c8d 100644 --- a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/index/ElasticsearchIndexEditorProvider.java +++ b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/index/ElasticsearchIndexEditorProvider.java @@ -55,7 +55,7 @@ public class ElasticsearchIndexEditorProvider implements IndexEditorProvider { String indexPath = indexingContext.getIndexPath(); ElasticsearchIndexDefinition indexDefinition = - new ElasticsearchIndexDefinition(root, definition.getNodeState(), indexPath); + new ElasticsearchIndexDefinition(root, definition.getNodeState(), indexPath, elasticsearchConnection.getIndexPrefix()); ElasticsearchIndexWriterFactory writerFactory = new ElasticsearchIndexWriterFactory(elasticsearchConnection); @@ -65,7 +65,7 @@ public class ElasticsearchIndexEditorProvider implements IndexEditorProvider { writerFactory, extractedTextCache, indexingContext, - true); + true, elasticsearchConnection.getIndexPrefix()); return new ElasticsearchIndexEditor(context); } diff --git a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/query/ElasticsearchIndexNode.java b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/query/ElasticsearchIndexNode.java index e87647e..f216a85 100644 --- a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/query/ElasticsearchIndexNode.java +++ b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/query/ElasticsearchIndexNode.java @@ -33,8 +33,8 @@ class ElasticsearchIndexNode implements IndexNode { ElasticsearchIndexNode(@NotNull NodeState root, @NotNull String indexPath, @NotNull ElasticsearchConnection elasticsearchConnection) { final NodeState indexNS = NodeStateUtils.getNode(root, indexPath); - this.indexDefinition = new ElasticsearchIndexDefinition(root, indexNS, indexPath); this.elasticsearchConnection = elasticsearchConnection; + this.indexDefinition = new ElasticsearchIndexDefinition(root, indexNS, indexPath, elasticsearchConnection.getIndexPrefix()); } @Override diff --git a/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchIndexProviderServiceTest.java b/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchIndexProviderServiceTest.java index 335e2ac..6e3a646 100644 --- a/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchIndexProviderServiceTest.java +++ b/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchIndexProviderServiceTest.java @@ -35,7 +35,10 @@ import org.junit.rules.TemporaryFolder; import java.io.File; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import static org.apache.jackrabbit.oak.plugins.index.elasticsearch.ElasticsearchIndexProviderService.PROP_INDEX_PREFIX; import static org.junit.Assert.assertNotNull; public class ElasticsearchIndexProviderServiceTest { @@ -63,9 +66,10 @@ public class ElasticsearchIndexProviderServiceTest { @Test public void defaultSetup() throws Exception { - MockOsgi.activate(service, context.bundleContext(), - Collections.singletonMap("localTextExtractionDir", folder.newFolder("localTextExtractionDir").getAbsolutePath()) - ); + Map props = new HashMap<>(); + props.put("localTextExtractionDir", folder.newFolder("localTextExtractionDir").getAbsolutePath()); + props.put(PROP_INDEX_PREFIX, "elastic"); + MockOsgi.activate(service, context.bundleContext(), props); assertNotNull(context.getService(QueryIndexProvider.class)); assertNotNull(context.getService(IndexEditorProvider.class)); diff --git a/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java b/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java index 8145e8d..689cc99 100644 --- a/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java +++ b/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elasticsearch/ElasticsearchPropertyIndexTest.java @@ -77,7 +77,8 @@ public class ElasticsearchPropertyIndexTest extends AbstractQueryTest { ElasticsearchConnection coordinate = new ElasticsearchConnection( ElasticsearchConnection.DEFAULT_SCHEME, elastic.getContainerIpAddress(), - elastic.getMappedPort(ElasticsearchConnection.DEFAULT_PORT) + elastic.getMappedPort(ElasticsearchConnection.DEFAULT_PORT), + "" + System.nanoTime() ); ElasticsearchIndexEditorProvider editorProvider = new ElasticsearchIndexEditorProvider(coordinate, new ExtractedTextCache(10 * FileUtils.ONE_MB, 100));