Skip to content

Commit ccdc259

Browse files
committed
Also clean up analyzers
1 parent 36431bf commit ccdc259

File tree

3 files changed

+78
-21
lines changed

3 files changed

+78
-21
lines changed

server/src/main/java/org/elasticsearch/index/IndexModule.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.elasticsearch.core.internal.io.IOUtils;
4343
import org.elasticsearch.env.NodeEnvironment;
4444
import org.elasticsearch.index.analysis.AnalysisRegistry;
45+
import org.elasticsearch.index.analysis.IndexAnalyzers;
4546
import org.elasticsearch.index.cache.query.DisabledQueryCache;
4647
import org.elasticsearch.index.cache.query.IndexQueryCache;
4748
import org.elasticsearch.index.cache.query.QueryCache;
@@ -401,6 +402,7 @@ public IndexService newIndexService(
401402
eventListener.beforeIndexCreated(indexSettings.getIndex(), indexSettings.getSettings());
402403
final IndexStorePlugin.DirectoryFactory directoryFactory = getDirectoryFactory(indexSettings, directoryFactories);
403404
QueryCache queryCache = null;
405+
IndexAnalyzers indexAnalyzers = null;
404406
boolean success = false;
405407
try {
406408
if (indexSettings.getValue(INDEX_QUERY_CACHE_ENABLED_SETTING)) {
@@ -413,16 +415,19 @@ public IndexService newIndexService(
413415
} else {
414416
queryCache = new DisabledQueryCache(indexSettings);
415417
}
418+
if (IndexService.needsMapperService(indexSettings, indexCreationContext)) {
419+
indexAnalyzers = analysisRegistry.build(indexSettings);
420+
}
416421
final IndexService indexService = new IndexService(indexSettings, indexCreationContext, environment, xContentRegistry,
417-
new SimilarityService(indexSettings, scriptService, similarities),
418-
shardStoreDeleter, analysisRegistry, engineFactory, circuitBreakerService, bigArrays, threadPool, scriptService,
419-
clusterService, client, queryCache, directoryFactory, eventListener, readerWrapperFactory, mapperRegistry,
420-
indicesFieldDataCache, searchOperationListeners, indexOperationListeners, namedWriteableRegistry);
422+
new SimilarityService(indexSettings, scriptService, similarities), shardStoreDeleter, indexAnalyzers,
423+
engineFactory, circuitBreakerService, bigArrays, threadPool, scriptService, clusterService, client, queryCache,
424+
directoryFactory, eventListener, readerWrapperFactory, mapperRegistry, indicesFieldDataCache, searchOperationListeners,
425+
indexOperationListeners, namedWriteableRegistry);
421426
success = true;
422427
return indexService;
423428
} finally {
424429
if (success == false) {
425-
IOUtils.closeWhileHandlingException(queryCache);
430+
IOUtils.closeWhileHandlingException(queryCache, indexAnalyzers);
426431
}
427432
}
428433
}

server/src/main/java/org/elasticsearch/index/IndexService.java

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import org.elasticsearch.env.NodeEnvironment;
4949
import org.elasticsearch.env.ShardLock;
5050
import org.elasticsearch.env.ShardLockObtainFailedException;
51-
import org.elasticsearch.index.analysis.AnalysisRegistry;
5251
import org.elasticsearch.index.analysis.IndexAnalyzers;
5352
import org.elasticsearch.index.cache.IndexCache;
5453
import org.elasticsearch.index.cache.bitset.BitsetFilterCache;
@@ -147,8 +146,7 @@ public IndexService(
147146
NamedXContentRegistry xContentRegistry,
148147
SimilarityService similarityService,
149148
ShardStoreDeleter shardStoreDeleter,
150-
AnalysisRegistry registry,
151-
EngineFactory engineFactory,
149+
IndexAnalyzers indexAnalyzers, EngineFactory engineFactory,
152150
CircuitBreakerService circuitBreakerService,
153151
BigArrays bigArrays,
154152
ThreadPool threadPool,
@@ -163,24 +161,16 @@ public IndexService(
163161
IndicesFieldDataCache indicesFieldDataCache,
164162
List<SearchOperationListener> searchOperationListeners,
165163
List<IndexingOperationListener> indexingOperationListeners,
166-
NamedWriteableRegistry namedWriteableRegistry) throws IOException {
164+
NamedWriteableRegistry namedWriteableRegistry) {
167165
super(indexSettings);
168166
this.indexSettings = indexSettings;
169167
this.xContentRegistry = xContentRegistry;
170168
this.similarityService = similarityService;
171169
this.namedWriteableRegistry = namedWriteableRegistry;
172170
this.circuitBreakerService = circuitBreakerService;
173-
if (indexSettings.getIndexMetaData().getState() == IndexMetaData.State.CLOSE &&
174-
indexCreationContext == IndexCreationContext.CREATE_INDEX) { // metadata verification needs a mapper service
175-
this.mapperService = null;
176-
this.indexFieldData = null;
177-
this.indexSortSupplier = () -> null;
178-
this.bitsetFilterCache = null;
179-
this.warmer = null;
180-
this.indexCache = null;
181-
} else {
182-
this.mapperService = new MapperService(indexSettings, registry.build(indexSettings), xContentRegistry, similarityService,
183-
mapperRegistry,
171+
if (needsMapperService(indexSettings, indexCreationContext)) {
172+
assert indexAnalyzers != null;
173+
this.mapperService = new MapperService(indexSettings, indexAnalyzers, xContentRegistry, similarityService, mapperRegistry,
184174
// we parse all percolator queries as they would be parsed on shard 0
185175
() -> newQueryShardContext(0, null, System::currentTimeMillis, null));
186176
this.indexFieldData = new IndexFieldDataService(indexSettings, indicesFieldDataCache, circuitBreakerService, mapperService);
@@ -198,6 +188,14 @@ public IndexService(
198188
this.bitsetFilterCache = new BitsetFilterCache(indexSettings, new BitsetCacheListener(this));
199189
this.warmer = new IndexWarmer(threadPool, indexFieldData, bitsetFilterCache.createListener(threadPool));
200190
this.indexCache = new IndexCache(indexSettings, queryCache, bitsetFilterCache);
191+
} else {
192+
assert indexAnalyzers == null;
193+
this.mapperService = null;
194+
this.indexFieldData = null;
195+
this.indexSortSupplier = () -> null;
196+
this.bitsetFilterCache = null;
197+
this.warmer = null;
198+
this.indexCache = null;
201199
}
202200

203201
this.shardStoreDeleter = shardStoreDeleter;
@@ -222,6 +220,11 @@ public IndexService(
222220
updateFsyncTaskIfNecessary();
223221
}
224222

223+
static boolean needsMapperService(IndexSettings indexSettings, IndexCreationContext indexCreationContext) {
224+
return false == (indexSettings.getIndexMetaData().getState() == IndexMetaData.State.CLOSE &&
225+
indexCreationContext == IndexCreationContext.CREATE_INDEX); // metadata verification needs a mapper service
226+
}
227+
225228
public enum IndexCreationContext {
226229
CREATE_INDEX,
227230
META_DATA_VERIFICATION

server/src/test/java/org/elasticsearch/index/IndexModuleTests.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.elasticsearch.index;
2020

21+
import org.apache.lucene.analysis.Analyzer;
2122
import org.apache.lucene.index.AssertingDirectoryReader;
2223
import org.apache.lucene.index.DirectoryReader;
2324
import org.apache.lucene.index.FieldInvertState;
@@ -47,6 +48,8 @@
4748
import org.elasticsearch.env.ShardLock;
4849
import org.elasticsearch.env.TestEnvironment;
4950
import org.elasticsearch.index.analysis.AnalysisRegistry;
51+
import org.elasticsearch.index.analysis.AnalyzerProvider;
52+
import org.elasticsearch.index.analysis.AnalyzerScope;
5053
import org.elasticsearch.index.cache.query.DisabledQueryCache;
5154
import org.elasticsearch.index.cache.query.IndexQueryCache;
5255
import org.elasticsearch.index.cache.query.QueryCache;
@@ -66,6 +69,7 @@
6669
import org.elasticsearch.index.store.FsDirectoryFactory;
6770
import org.elasticsearch.indices.IndicesModule;
6871
import org.elasticsearch.indices.IndicesQueryCache;
72+
import org.elasticsearch.indices.analysis.AnalysisModule;
6973
import org.elasticsearch.indices.breaker.CircuitBreakerService;
7074
import org.elasticsearch.indices.breaker.NoneCircuitBreakerService;
7175
import org.elasticsearch.indices.cluster.IndicesClusterStateService.AllocatedIndices.IndexRemovalReason;
@@ -92,6 +96,7 @@
9296
import java.util.concurrent.atomic.AtomicBoolean;
9397

9498
import static java.util.Collections.emptyMap;
99+
import static java.util.Collections.singletonMap;
95100
import static org.elasticsearch.index.IndexService.IndexCreationContext.CREATE_INDEX;
96101
import static org.hamcrest.Matchers.containsString;
97102
import static org.hamcrest.Matchers.empty;
@@ -178,7 +183,7 @@ public void testRegisterIndexStore() throws IOException {
178183
.put(IndexModule.INDEX_STORE_TYPE_SETTING.getKey(), "foo_store")
179184
.build();
180185
final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings(index, settings);
181-
final Map<String, IndexStorePlugin.DirectoryFactory> indexStoreFactories = Collections.singletonMap(
186+
final Map<String, IndexStorePlugin.DirectoryFactory> indexStoreFactories = singletonMap(
182187
"foo_store", new FooFunction());
183188
final IndexModule module = new IndexModule(indexSettings, emptyAnalysisRegistry, new InternalEngineFactory(), indexStoreFactories);
184189

@@ -414,6 +419,50 @@ public void testCustomQueryCacheCleanedUpIfIndexServiceCreationFails() {
414419
assertThat(liveQueryCaches, empty());
415420
}
416421

422+
public void testIndexAnalyzersCleanedUpIfIndexServiceCreationFails() {
423+
Settings settings = Settings.builder()
424+
.put(Environment.PATH_HOME_SETTING.getKey(), createTempDir().toString())
425+
.put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT).build();
426+
final IndexSettings indexSettings = IndexSettingsModule.newIndexSettings("foo", settings);
427+
428+
final HashSet<Analyzer> openAnalyzers = new HashSet<>();
429+
final AnalysisModule.AnalysisProvider<AnalyzerProvider<?>> analysisProvider = (i,e,n,s) -> new AnalyzerProvider<>() {
430+
@Override
431+
public String name() {
432+
return "test";
433+
}
434+
435+
@Override
436+
public AnalyzerScope scope() {
437+
return AnalyzerScope.INDEX;
438+
}
439+
440+
@Override
441+
public Analyzer get() {
442+
final Analyzer analyzer = new Analyzer() {
443+
@Override
444+
protected TokenStreamComponents createComponents(String fieldName) {
445+
throw new AssertionError("should not be here");
446+
}
447+
448+
@Override
449+
public void close() {
450+
super.close();
451+
openAnalyzers.remove(this);
452+
}
453+
};
454+
openAnalyzers.add(analyzer);
455+
return analyzer;
456+
}
457+
};
458+
final AnalysisRegistry analysisRegistry = new AnalysisRegistry(environment, emptyMap(), emptyMap(), emptyMap(),
459+
singletonMap("test", analysisProvider), emptyMap(), emptyMap(), emptyMap(), emptyMap(), emptyMap());
460+
IndexModule module = new IndexModule(indexSettings, analysisRegistry, new InternalEngineFactory(), Collections.emptyMap());
461+
threadPool.shutdown(); // causes index service creation to fail
462+
expectThrows(EsRejectedExecutionException.class, () -> newIndexService(module));
463+
assertThat(openAnalyzers, empty());
464+
}
465+
417466
public void testMmapNotAllowed() {
418467
String storeType = randomFrom(IndexModule.Type.HYBRIDFS.getSettingsKey(), IndexModule.Type.MMAPFS.getSettingsKey());
419468
final Settings settings = Settings.builder()

0 commit comments

Comments
 (0)