Skip to content

Commit

Permalink
HSEARCH-3775 Move the creation of the index accessor to a new IOStrat…
Browse files Browse the repository at this point in the history
…egy class
  • Loading branch information
yrodiere committed Feb 13, 2020
1 parent d33dcf6 commit 4739d13
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 42 deletions.
Expand Up @@ -12,12 +12,9 @@
import org.hibernate.search.backend.lucene.document.impl.LuceneIndexEntryFactory;
import org.hibernate.search.backend.lucene.document.impl.LuceneRootDocumentBuilder;
import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexModel;
import org.hibernate.search.backend.lucene.lowlevel.directory.impl.DirectoryCreationContextImpl;
import org.hibernate.search.backend.lucene.lowlevel.directory.spi.DirectoryCreationContext;
import org.hibernate.search.backend.lucene.lowlevel.directory.spi.DirectoryHolder;
import org.hibernate.search.backend.lucene.lowlevel.directory.spi.DirectoryProvider;
import org.hibernate.search.backend.lucene.lowlevel.index.impl.IOStrategy;
import org.hibernate.search.backend.lucene.lowlevel.index.impl.IndexAccessorImpl;
import org.hibernate.search.backend.lucene.lowlevel.writer.impl.IndexWriterProvider;
import org.hibernate.search.backend.lucene.multitenancy.impl.MultiTenancyStrategy;
import org.hibernate.search.backend.lucene.orchestration.impl.LuceneBatchingWriteWorkOrchestrator;
import org.hibernate.search.backend.lucene.orchestration.impl.LuceneReadWorkOrchestrator;
Expand All @@ -43,14 +40,14 @@
import org.hibernate.search.engine.backend.work.execution.spi.IndexIndexer;
import org.hibernate.search.engine.backend.work.execution.spi.IndexIndexingPlan;
import org.hibernate.search.engine.backend.work.execution.spi.IndexWorkspace;
import org.hibernate.search.engine.cfg.spi.ConfigurationPropertySource;
import org.hibernate.search.engine.environment.thread.spi.ThreadPoolProvider;
import org.hibernate.search.engine.reporting.FailureHandler;
import org.hibernate.search.engine.reporting.spi.EventContexts;
import org.hibernate.search.engine.search.loading.context.spi.LoadingContextBuilder;
import org.hibernate.search.util.common.impl.SuppressingCloser;
import org.hibernate.search.util.common.reporting.EventContext;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.facet.FacetsConfig;

public class IndexManagerBackendContext implements WorkExecutionBackendContext, SearchBackendContext {
Expand Down Expand Up @@ -169,14 +166,19 @@ LuceneIndexEntryFactory createLuceneIndexEntryFactory(String indexName, FacetsCo
return new LuceneIndexEntryFactory( multiTenancyStrategy, indexName, facetsConfig );
}

Shard createShard(LuceneIndexModel model, Optional<String> shardId) {
LuceneWriteWorkOrchestratorImplementor writeOrchestrator = null;
IOStrategy createIOStrategy(ConfigurationPropertySource propertySource) {
// FIXME HSEARCH-3775 this should use the property source to define refresh intervals, etc.
return new IOStrategy( directoryProvider, threadPoolProvider, failureHandler );
}

Shard createShard(IOStrategy ioStrategy, LuceneIndexModel model, Optional<String> shardId) {
LuceneWriteWorkOrchestratorImplementor writeOrchestrator;
IndexAccessorImpl indexAccessor = null;
String indexName = model.getIndexName();
EventContext shardEventContext = EventContexts.fromIndexNameAndShardId( model.getIndexName(), shardId );

try {
indexAccessor = createIndexAccessor(
indexAccessor = ioStrategy.createIndexAccessor(
indexName, shardEventContext,
shardId, model.getScopedAnalyzer()
);
Expand All @@ -192,36 +194,6 @@ Shard createShard(LuceneIndexModel model, Optional<String> shardId) {
}
}

private IndexAccessorImpl createIndexAccessor(String indexName, EventContext eventContext,
Optional<String> shardId, Analyzer analyzer) {
DirectoryHolder directoryHolder;
DirectoryCreationContext context = new DirectoryCreationContextImpl(
shardId.isPresent() ? EventContexts.fromShardId( shardId.get() ) : null,
indexName,
shardId
);
directoryHolder = directoryProvider.createDirectoryHolder( context );
IndexWriterProvider indexWriterProvider = null;
try {
indexWriterProvider = new IndexWriterProvider(
indexName, eventContext,
directoryHolder, analyzer,
threadPoolProvider.getThreadProvider(),
failureHandler
);
return new IndexAccessorImpl(
eventContext,
directoryHolder, indexWriterProvider
);
}
catch (RuntimeException e) {
new SuppressingCloser( e )
.push( IndexWriterProvider::clear, indexWriterProvider )
.push( directoryHolder );
throw e;
}
}

private LuceneWriteWorkOrchestratorImplementor createWriteOrchestrator(String indexName,
EventContext eventContext, IndexAccessorImpl indexAccessor) {
return new LuceneBatchingWriteWorkOrchestrator(
Expand All @@ -234,5 +206,4 @@ private LuceneWriteWorkOrchestratorImplementor createWriteOrchestrator(String in
failureHandler
);
}

}
Expand Up @@ -18,6 +18,7 @@

import org.hibernate.search.backend.lucene.document.model.impl.LuceneIndexModel;
import org.hibernate.search.backend.lucene.index.spi.ShardingStrategy;
import org.hibernate.search.backend.lucene.lowlevel.index.impl.IOStrategy;
import org.hibernate.search.backend.lucene.lowlevel.reader.impl.DirectoryReaderCollector;
import org.hibernate.search.backend.lucene.lowlevel.reader.impl.ReadIndexManagerContext;
import org.hibernate.search.backend.lucene.orchestration.impl.LuceneWriteWorkOrchestrator;
Expand Down Expand Up @@ -53,9 +54,11 @@ CompletableFuture<?> start(IndexManagerStartContext startContext) {
ConfigurationPropertySource propertySource = startContext.getConfigurationPropertySource();

try {
IOStrategy ioStrategy = backendContext.createIOStrategy( propertySource );
ShardingStrategyInitializationContextImpl initializationContext =
new ShardingStrategyInitializationContextImpl(
backendContext,
ioStrategy,
model,
startContext,
propertySource.withMask( "sharding" )
Expand Down
Expand Up @@ -17,6 +17,7 @@
import org.hibernate.search.backend.lucene.index.spi.ShardingStrategy;
import org.hibernate.search.backend.lucene.index.spi.ShardingStrategyInitializationContext;
import org.hibernate.search.backend.lucene.logging.impl.Log;
import org.hibernate.search.backend.lucene.lowlevel.index.impl.IOStrategy;
import org.hibernate.search.engine.backend.index.spi.IndexManagerStartContext;
import org.hibernate.search.engine.cfg.spi.ConfigurationProperty;
import org.hibernate.search.engine.cfg.spi.ConfigurationPropertySource;
Expand All @@ -40,6 +41,7 @@ class ShardingStrategyInitializationContextImpl implements ShardingStrategyIniti
.build();

private final IndexManagerBackendContext backendContext;
private final IOStrategy ioStrategy;
private final LuceneIndexModel model;
private final IndexManagerStartContext startContext;
private final ConfigurationPropertySource propertySource;
Expand All @@ -48,10 +50,11 @@ class ShardingStrategyInitializationContextImpl implements ShardingStrategyIniti

ShardingStrategyInitializationContextImpl(
IndexManagerBackendContext backendContext,
LuceneIndexModel model,
IOStrategy ioStrategy, LuceneIndexModel model,
IndexManagerStartContext startContext,
ConfigurationPropertySource propertySource) {
this.backendContext = backendContext;
this.ioStrategy = ioStrategy;
this.model = model;
this.startContext = startContext;
this.propertySource = propertySource;
Expand Down Expand Up @@ -110,7 +113,7 @@ public BeanHolder<? extends ShardingStrategy> create(Map<String, Shard> shardCol

private void contributeShardWithSilentFailure(Map<String, Shard> shardCollector, Optional<String> shardId) {
try {
Shard shard = backendContext.createShard( model, shardId );
Shard shard = backendContext.createShard( ioStrategy, model, shardId );
shardCollector.put( shardId.orElse( null ), shard );
}
catch (RuntimeException e) {
Expand Down
@@ -0,0 +1,72 @@
/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.backend.lucene.lowlevel.index.impl;

import java.util.Optional;

import org.hibernate.search.backend.lucene.lowlevel.directory.impl.DirectoryCreationContextImpl;
import org.hibernate.search.backend.lucene.lowlevel.directory.spi.DirectoryCreationContext;
import org.hibernate.search.backend.lucene.lowlevel.directory.spi.DirectoryHolder;
import org.hibernate.search.backend.lucene.lowlevel.directory.spi.DirectoryProvider;
import org.hibernate.search.backend.lucene.lowlevel.writer.impl.IndexWriterProvider;
import org.hibernate.search.engine.environment.thread.spi.ThreadPoolProvider;
import org.hibernate.search.engine.reporting.FailureHandler;
import org.hibernate.search.engine.reporting.spi.EventContexts;
import org.hibernate.search.util.common.impl.SuppressingCloser;
import org.hibernate.search.util.common.reporting.EventContext;

import org.apache.lucene.analysis.Analyzer;

public final class IOStrategy {

private final DirectoryProvider directoryProvider;
private final ThreadPoolProvider threadPoolProvider;
private final FailureHandler failureHandler;

public IOStrategy(DirectoryProvider directoryProvider, ThreadPoolProvider threadPoolProvider,
FailureHandler failureHandler) {
this.directoryProvider = directoryProvider;
this.threadPoolProvider = threadPoolProvider;
this.failureHandler = failureHandler;
}

public IndexAccessorImpl createIndexAccessor(String indexName, EventContext eventContext,
Optional<String> shardId, Analyzer analyzer) {
DirectoryHolder directoryHolder;
DirectoryCreationContext context = new DirectoryCreationContextImpl(
shardId.isPresent() ? EventContexts.fromShardId( shardId.get() ) : null,
indexName,
shardId
);
directoryHolder = directoryProvider.createDirectoryHolder( context );
IndexWriterProvider indexWriterProvider = null;
try {
indexWriterProvider = createIndexWriterProvider( indexName, eventContext, analyzer, directoryHolder );
return new IndexAccessorImpl(
eventContext,
directoryHolder, indexWriterProvider
);
}
catch (RuntimeException e) {
new SuppressingCloser( e )
.push( IndexWriterProvider::clear, indexWriterProvider )
.push( directoryHolder );
throw e;
}
}

private IndexWriterProvider createIndexWriterProvider(String indexName, EventContext eventContext, Analyzer analyzer,
DirectoryHolder directoryHolder) {
return new IndexWriterProvider(
indexName, eventContext,
directoryHolder, analyzer,
threadPoolProvider.getThreadProvider(),
failureHandler
);
}

}
Expand Up @@ -8,6 +8,7 @@

import java.io.IOException;

import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexableField;
import org.apache.lucene.index.Term;
Expand Down Expand Up @@ -63,8 +64,15 @@ public void commit() throws IOException {
delegate.commit();
}

public DirectoryReader openReader() throws IOException {
return DirectoryReader.open( delegate );
}

public DirectoryReader openReaderIfChanged(DirectoryReader oldReader) throws IOException {
return DirectoryReader.openIfChanged( oldReader, delegate );
}

void close() throws IOException {
delegate.close();
}

}

0 comments on commit 4739d13

Please sign in to comment.