Skip to content

Commit f8a376b

Browse files
committed
Infrastructure for resharding search filters
1 parent 06da8a4 commit f8a376b

File tree

6 files changed

+20
-14
lines changed

6 files changed

+20
-14
lines changed

server/src/internalClusterTest/java/org/elasticsearch/get/GetActionIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public static class SearcherWrapperPlugin extends Plugin {
8787
public void onIndexModule(IndexModule indexModule) {
8888
super.onIndexModule(indexModule);
8989
if (enabled) {
90-
indexModule.setReaderWrapper(indexService -> {
90+
indexModule.addReaderWrapper(indexService -> {
9191
CheckedFunction<DirectoryReader, DirectoryReader, IOException> wrapper = EngineTestCase.randomReaderWrapper();
9292
return reader -> {
9393
calls.incrementAndGet();

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,8 @@ public interface DirectoryWrapper {
166166
private final AnalysisRegistry analysisRegistry;
167167
private final EngineFactory engineFactory;
168168
private final SetOnce<DirectoryWrapper> indexDirectoryWrapper = new SetOnce<>();
169-
private final SetOnce<Function<IndexService, CheckedFunction<DirectoryReader, DirectoryReader, IOException>>> indexReaderWrapper =
170-
new SetOnce<>();
169+
private final List<Function<IndexService, CheckedFunction<DirectoryReader, DirectoryReader, IOException>>> indexReaderWrappers =
170+
new ArrayList<>();
171171
private final Set<IndexEventListener> indexEventListeners = new HashSet<>();
172172
private final Map<String, TriFunction<Settings, IndexVersion, ScriptService, Similarity>> similarities = new HashMap<>();
173173
private final Map<String, IndexStorePlugin.DirectoryFactory> directoryFactories;
@@ -368,9 +368,9 @@ public void addSimilarity(String name, TriFunction<Settings, IndexVersion, Scrip
368368
}
369369

370370
/**
371-
* Sets the factory for creating new {@link DirectoryReader} wrapper instances.
371+
* Adds a new instance of factory creating new {@link DirectoryReader} wrapper instances.
372372
* The factory ({@link Function}) is called once the IndexService is fully constructed.
373-
* NOTE: this method can only be called once per index. Multiple wrappers are not supported.
373+
* All added wrappers are applied in the order they have been added.
374374
* <p>
375375
* The {@link CheckedFunction} is invoked each time a {@link Engine.Searcher} is requested to do an operation,
376376
* for example search, and must return a new directory reader wrapping the provided directory reader or if no
@@ -384,11 +384,11 @@ public void addSimilarity(String name, TriFunction<Settings, IndexVersion, Scrip
384384
* The returned reader is closed once it goes out of scope.
385385
* </p>
386386
*/
387-
public void setReaderWrapper(
387+
public void addReaderWrapper(
388388
Function<IndexService, CheckedFunction<DirectoryReader, DirectoryReader, IOException>> indexReaderWrapperFactory
389389
) {
390390
ensureNotFrozen();
391-
this.indexReaderWrapper.set(indexReaderWrapperFactory);
391+
this.indexReaderWrappers.add(indexReaderWrapperFactory);
392392
}
393393

394394
/**
@@ -499,8 +499,14 @@ public IndexService newIndexService(
499499
QueryRewriteInterceptor queryRewriteInterceptor
500500
) throws IOException {
501501
final IndexEventListener eventListener = freeze();
502-
Function<IndexService, CheckedFunction<DirectoryReader, DirectoryReader, IOException>> readerWrapperFactory = indexReaderWrapper
503-
.get() == null ? (shard) -> null : indexReaderWrapper.get();
502+
Function<IndexService, CheckedFunction<DirectoryReader, DirectoryReader, IOException>> readerWrapperFactory = indexReaderWrappers
503+
.isEmpty() ? indexService -> null : indexService -> (directoryReader) -> {
504+
var wrapped = indexReaderWrappers.get(0).apply(indexService).apply(directoryReader);
505+
for (int i = 1; i < indexReaderWrappers.size(); i++) {
506+
wrapped = indexReaderWrappers.get(i).apply(indexService).apply(wrapped);
507+
}
508+
return wrapped;
509+
};
504510
eventListener.beforeIndexCreated(indexSettings.getIndex(), indexSettings.getSettings());
505511
final IndexStorePlugin.DirectoryFactory directoryFactory = getDirectoryFactory(indexSettings, directoryFactories);
506512
final IndexStorePlugin.RecoveryStateFactory recoveryStateFactory = getRecoveryStateFactory(indexSettings, recoveryStateFactories);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ public void testWrapperIsBound() throws IOException {
267267
new SearchStatsSettings(ClusterSettings.createBuiltInClusterSettings()),
268268
MergeMetrics.NOOP
269269
);
270-
module.setReaderWrapper(s -> new Wrapper());
270+
module.addReaderWrapper(s -> new Wrapper());
271271

272272
IndexService indexService = newIndexService(module);
273273
assertTrue(indexService.getReaderWrapper() instanceof Wrapper);
@@ -489,7 +489,7 @@ public void testFrozen() {
489489
assertEquals(msg, expectThrows(IllegalStateException.class, () -> module.addIndexEventListener(null)).getMessage());
490490
assertEquals(msg, expectThrows(IllegalStateException.class, () -> module.addIndexOperationListener(null)).getMessage());
491491
assertEquals(msg, expectThrows(IllegalStateException.class, () -> module.addSimilarity(null, null)).getMessage());
492-
assertEquals(msg, expectThrows(IllegalStateException.class, () -> module.setReaderWrapper(null)).getMessage());
492+
assertEquals(msg, expectThrows(IllegalStateException.class, () -> module.addReaderWrapper(null)).getMessage());
493493
assertEquals(msg, expectThrows(IllegalStateException.class, () -> module.forceQueryCacheProvider(null)).getMessage());
494494
assertEquals(msg, expectThrows(IllegalStateException.class, () -> module.setDirectoryWrapper(null)).getMessage());
495495
assertEquals(msg, expectThrows(IllegalStateException.class, () -> module.setIndexCommitListener(null)).getMessage());

server/src/test/java/org/elasticsearch/search/SearchServiceSingleNodeTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ protected Collection<Class<? extends Plugin>> getPlugins() {
199199
public static class ReaderWrapperCountPlugin extends Plugin {
200200
@Override
201201
public void onIndexModule(IndexModule indexModule) {
202-
indexModule.setReaderWrapper(service -> SearchServiceSingleNodeTests::apply);
202+
indexModule.addReaderWrapper(service -> SearchServiceSingleNodeTests::apply);
203203
}
204204
}
205205

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/Security.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1585,7 +1585,7 @@ public void onIndexModule(IndexModule module) {
15851585
assert getLicenseState() != null;
15861586
if (XPackSettings.DLS_FLS_ENABLED.get(settings)) {
15871587
assert dlsBitsetCache.get() != null;
1588-
module.setReaderWrapper(
1588+
module.addReaderWrapper(
15891589
indexService -> new SecurityIndexReaderWrapper(
15901590
shardId -> indexService.newSearchExecutionContext(
15911591
shardId.id(),

x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/SecurityTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ public void testOnIndexModuleIsNoOpWithSecurityDisabled() throws Exception {
475475
);
476476
security.onIndexModule(indexModule);
477477
// indexReaderWrapper is a SetOnce so if Security#onIndexModule had already set an ReaderWrapper we would get an exception here
478-
indexModule.setReaderWrapper(null);
478+
indexModule.addReaderWrapper(null);
479479
}
480480

481481
public void testFilteredSettings() throws Exception {

0 commit comments

Comments
 (0)