diff --git a/server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java b/server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java index 945e5e4673bd9..93ab95ae99e69 100644 --- a/server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java +++ b/server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java @@ -152,8 +152,6 @@ final class DefaultSearchContext extends SearchContext { ShardSearchRequest request, SearchShardTarget shardTarget, ClusterService clusterService, - IndexService indexService, - IndexShard indexShard, BigArrays bigArrays, LongSupplier relativeTimeSupplier, TimeValue timeout, @@ -169,8 +167,8 @@ final class DefaultSearchContext extends SearchContext { this.dfsResult = new DfsSearchResult(readerContext.id(), shardTarget, request); this.queryResult = new QuerySearchResult(readerContext.id(), shardTarget, request); this.fetchResult = new FetchSearchResult(readerContext.id(), shardTarget); - this.indexShard = indexShard; - this.indexService = indexService; + this.indexService = readerContext.indexService(); + this.indexShard = readerContext.indexShard(); this.clusterService = clusterService; this.engineSearcher = readerContext.acquireSearcher("search"); this.searcher = new ContextIndexSearcher(engineSearcher.getIndexReader(), engineSearcher.getSimilarity(), diff --git a/server/src/main/java/org/elasticsearch/search/SearchService.java b/server/src/main/java/org/elasticsearch/search/SearchService.java index fb01c6a9f207b..d49c08b1bd247 100644 --- a/server/src/main/java/org/elasticsearch/search/SearchService.java +++ b/server/src/main/java/org/elasticsearch/search/SearchService.java @@ -31,6 +31,7 @@ import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchShardTask; import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.action.support.TransportActions; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.CheckedSupplier; @@ -320,8 +321,7 @@ protected void doClose() { public void executeDfsPhase(ShardSearchRequest request, boolean keepStatesInContext, SearchShardTask task, ActionListener listener) { - IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex()); - IndexShard shard = indexService.getShard(request.shardId().id()); + final IndexShard shard = getShard(request); rewriteAndFetchShardRequest(shard, request, new ActionListener() { @Override public void onResponse(ShardSearchRequest rewritten) { @@ -372,8 +372,7 @@ public void executeQueryPhase(ShardSearchRequest request, boolean keepStatesInCo SearchShardTask task, ActionListener listener) { assert request.canReturnNullResponseIfMatchNoDocs() == false || request.numberOfShards() > 1 : "empty responses require more than one shard"; - IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex()); - IndexShard shard = indexService.getShard(request.shardId().id()); + final IndexShard shard = getShard(request); rewriteAndFetchShardRequest(shard, request, new ActionListener() { @Override public void onResponse(ShardSearchRequest orig) { @@ -388,8 +387,8 @@ public void onResponse(ShardSearchRequest orig) { // entirely. Otherwise we fork the execution in the search thread pool. ShardSearchRequest canMatchRequest = new ShardSearchRequest(orig); try (Engine.Searcher searcher = readerContext.acquireSearcher("can_match")) { - QueryShardContext context = indexService.newQueryShardContext(canMatchRequest.shardId().id(), searcher, - canMatchRequest::nowInMillis, canMatchRequest.getClusterAlias()); + QueryShardContext context = readerContext.indexService().newQueryShardContext(canMatchRequest.shardId().id(), + searcher, canMatchRequest::nowInMillis, canMatchRequest.getClusterAlias()); Rewriteable.rewrite(canMatchRequest.getRewriteable(), context, true); } if (canRewriteToMatchNone(canMatchRequest.source()) @@ -433,6 +432,14 @@ public void onFailure(Exception exc) { }); } + private IndexShard getShard(ShardSearchRequest request) { + if (request.readerId() != null) { + return findReaderContext(request.readerId()).indexShard(); + } else { + return indicesService.indexServiceSafe(request.shardId().getIndex()).getShard(request.shardId().id()); + } + } + private void runAsync(IndexShard shard, CheckedSupplier command, ActionListener listener) { Executor executor = getExecutor(shard); executor.execute(() -> { @@ -543,6 +550,7 @@ public void executeQueryPhase(QuerySearchRequest request, SearchShardTask task, readerContext.setRescoreDocIds(rescoreDocIds); return searchContext.queryResult(); } catch (Exception e) { + assert TransportActions.isShardNotAvailableException(e) == false : new AssertionError(e); logger.trace("Query phase failed", e); processFailure(readerContext, e); throw e; @@ -580,6 +588,7 @@ public void executeFetchPhase(InternalScrollSearchRequest request, SearchShardTa QueryFetchSearchResult fetchSearchResult = executeFetchPhase(readerContext, searchContext, afterQueryTime); return new ScrollQueryFetchSearchResult(fetchSearchResult, searchContext.shardTarget()); } catch (Exception e) { + assert TransportActions.isShardNotAvailableException(e) == false : new AssertionError(e); logger.trace("Fetch phase failed", e); processFailure(readerContext, e); throw e; @@ -610,6 +619,7 @@ public void executeFetchPhase(ShardFetchRequest request, SearchShardTask task, A } return searchContext.fetchResult(); } catch (Exception e) { + assert TransportActions.isShardNotAvailableException(e) == false : new AssertionError(e); logger.trace("Fetch phase failed", e); processFailure(readerContext, e); throw e; @@ -649,10 +659,10 @@ final ReaderContext createOrGetReaderContext(ShardSearchRequest request, boolean IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex()); IndexShard shard = indexService.getShard(request.shardId().id()); Engine.SearcherSupplier reader = shard.acquireSearcherSupplier(); - return createAndPutReaderContext(request, shard, reader, keepStatesInContext); + return createAndPutReaderContext(request, indexService, shard, reader, keepStatesInContext); } - final ReaderContext createAndPutReaderContext(ShardSearchRequest request, IndexShard shard, + final ReaderContext createAndPutReaderContext(ShardSearchRequest request, IndexService indexService, IndexShard shard, Engine.SearcherSupplier reader, boolean keepStatesInContext) { assert request.readerId() == null; assert request.keepAlive() == null; @@ -671,13 +681,13 @@ final ReaderContext createAndPutReaderContext(ShardSearchRequest request, IndexS final long keepAlive = getKeepAlive(request); checkKeepAliveLimit(keepAlive); if (keepStatesInContext || request.scroll() != null) { - readerContext = new LegacyReaderContext(idGenerator.incrementAndGet(), shard, reader, request, keepAlive); + readerContext = new LegacyReaderContext(idGenerator.incrementAndGet(), indexService, shard, reader, request, keepAlive); if (request.scroll() != null) { readerContext.addOnClose(decreaseScrollContexts); decreaseScrollContexts = null; } } else { - readerContext = new ReaderContext(idGenerator.incrementAndGet(), shard, reader, keepAlive, + readerContext = new ReaderContext(idGenerator.incrementAndGet(), indexService, shard, reader, keepAlive, request.keepAlive() == null); } reader = null; @@ -722,7 +732,7 @@ public void openReaderContext(ShardId shardId, TimeValue keepAlive, ActionListen try { searcherSupplier = shard.acquireSearcherSupplier(); readerContext = new ReaderContext( - idGenerator.incrementAndGet(), shard, searcherSupplier, keepAlive.millis(), false); + idGenerator.incrementAndGet(), indexService, shard, searcherSupplier, keepAlive.millis(), false); final ReaderContext finalReaderContext = readerContext; searcherSupplier = null; // transfer ownership to reader context searchOperationListener.onNewReaderContext(readerContext); @@ -773,9 +783,10 @@ final SearchContext createContext(ReaderContext readerContext, } public DefaultSearchContext createSearchContext(ShardSearchRequest request, TimeValue timeout) throws IOException { - IndexShard indexShard = indicesService.indexServiceSafe(request.shardId().getIndex()).getShard(request.shardId().getId()); - Engine.SearcherSupplier reader = indexShard.acquireSearcherSupplier(); - try (ReaderContext readerContext = new ReaderContext(idGenerator.incrementAndGet(), indexShard, reader, -1L, true)) { + final IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex()); + final IndexShard indexShard = indexService.getShard(request.shardId().getId()); + final Engine.SearcherSupplier reader = indexShard.acquireSearcherSupplier(); + try (ReaderContext readerContext = new ReaderContext(idGenerator.incrementAndGet(), indexService, indexShard, reader, -1L, true)) { DefaultSearchContext searchContext = createSearchContext(readerContext, request, timeout); searchContext.addReleasable(readerContext.markAsUsed()); return searchContext; @@ -787,11 +798,9 @@ private DefaultSearchContext createSearchContext(ReaderContext reader, ShardSear boolean success = false; DefaultSearchContext searchContext = null; try { - IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex()); - IndexShard indexShard = indexService.getShard(request.shardId().getId()); SearchShardTarget shardTarget = new SearchShardTarget(clusterService.localNode().getId(), - indexShard.shardId(), request.getClusterAlias(), OriginalIndices.NONE); - searchContext = new DefaultSearchContext(reader, request, shardTarget, clusterService, indexService, indexShard, + reader.indexShard().shardId(), request.getClusterAlias(), OriginalIndices.NONE); + searchContext = new DefaultSearchContext(reader, request, shardTarget, clusterService, bigArrays, threadPool::relativeTimeInMillis, timeout, fetchPhase, lowLevelCancellation); // we clone the query shard context here just for rewriting otherwise we // might end up with incorrect state since we are using now() or script services diff --git a/server/src/main/java/org/elasticsearch/search/internal/LegacyReaderContext.java b/server/src/main/java/org/elasticsearch/search/internal/LegacyReaderContext.java index 5be1aeea9be73..1c3c14ab14d38 100644 --- a/server/src/main/java/org/elasticsearch/search/internal/LegacyReaderContext.java +++ b/server/src/main/java/org/elasticsearch/search/internal/LegacyReaderContext.java @@ -21,6 +21,7 @@ import org.elasticsearch.common.lease.Releasable; import org.elasticsearch.common.lease.Releasables; +import org.elasticsearch.index.IndexService; import org.elasticsearch.index.engine.Engine; import org.elasticsearch.index.shard.IndexShard; import org.elasticsearch.search.RescoreDocIds; @@ -37,9 +38,9 @@ public class LegacyReaderContext extends ReaderContext { private Engine.Searcher searcher; private Releasable onClose; - public LegacyReaderContext(long id, IndexShard indexShard, Engine.SearcherSupplier reader, + public LegacyReaderContext(long id, IndexService indexService, IndexShard indexShard, Engine.SearcherSupplier reader, ShardSearchRequest shardSearchRequest, long keepAliveInMillis) { - super(id, indexShard, reader, keepAliveInMillis, false); + super(id, indexService, indexShard, reader, keepAliveInMillis, false); assert shardSearchRequest.readerId() == null; assert shardSearchRequest.keepAlive() == null; this.shardSearchRequest = Objects.requireNonNull(shardSearchRequest); diff --git a/server/src/main/java/org/elasticsearch/search/internal/ReaderContext.java b/server/src/main/java/org/elasticsearch/search/internal/ReaderContext.java index 1caea59c7e608..43f0a8272af6f 100644 --- a/server/src/main/java/org/elasticsearch/search/internal/ReaderContext.java +++ b/server/src/main/java/org/elasticsearch/search/internal/ReaderContext.java @@ -23,6 +23,7 @@ import org.elasticsearch.common.lease.Releasable; import org.elasticsearch.common.lease.Releasables; import org.elasticsearch.common.util.concurrent.AbstractRefCounted; +import org.elasticsearch.index.IndexService; import org.elasticsearch.index.engine.Engine; import org.elasticsearch.index.shard.IndexShard; import org.elasticsearch.search.RescoreDocIds; @@ -45,6 +46,7 @@ */ public class ReaderContext implements Releasable { private final SearchContextId id; + private final IndexService indexService; private final IndexShard indexShard; protected final Engine.SearcherSupplier searcherSupplier; private final AtomicBoolean closed = new AtomicBoolean(false); @@ -62,11 +64,13 @@ public class ReaderContext implements Releasable { private Map context; public ReaderContext(long id, + IndexService indexService, IndexShard indexShard, Engine.SearcherSupplier searcherSupplier, long keepAliveInMillis, boolean singleSession) { this.id = new SearchContextId(UUIDs.base64UUID(), id); + this.indexService = indexService; this.indexShard = indexShard; this.searcherSupplier = searcherSupplier; this.singleSession = singleSession; @@ -103,6 +107,9 @@ public SearchContextId id() { return id; } + public IndexService indexService() { + return indexService; + } public IndexShard indexShard() { return indexShard; diff --git a/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java b/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java index de96b084f3e6c..0d1cef7a9ef7e 100644 --- a/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java +++ b/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java @@ -138,9 +138,9 @@ protected Engine.Searcher acquireSearcherInternal(String source) { SearchShardTarget target = new SearchShardTarget("node", shardId, null, OriginalIndices.NONE); ReaderContext readerWithoutScroll = new ReaderContext( - randomNonNegativeLong(), indexShard, engineReader, randomNonNegativeLong(), false); + randomNonNegativeLong(), indexService, indexShard, engineReader, randomNonNegativeLong(), false); DefaultSearchContext contextWithoutScroll = new DefaultSearchContext(readerWithoutScroll, shardSearchRequest, target, null, - indexService, indexShard, bigArrays, null, timeout, null, false); + bigArrays, null, timeout, null, false); contextWithoutScroll.from(300); contextWithoutScroll.close(); @@ -154,9 +154,9 @@ protected Engine.Searcher acquireSearcherInternal(String source) { // resultWindow greater than maxResultWindow and scrollContext isn't null when(shardSearchRequest.scroll()).thenReturn(new Scroll(TimeValue.timeValueMillis(randomInt(1000)))); ReaderContext readerContext = new LegacyReaderContext( - randomNonNegativeLong(), indexShard, engineReader, shardSearchRequest, randomNonNegativeLong()); - DefaultSearchContext context1 = new DefaultSearchContext(readerContext, shardSearchRequest, target, null, indexService, - indexShard, bigArrays, null, timeout, null, false); + randomNonNegativeLong(), indexService, indexShard, engineReader, shardSearchRequest, randomNonNegativeLong()); + DefaultSearchContext context1 = new DefaultSearchContext(readerContext, shardSearchRequest, target, null, + bigArrays, null, timeout, null, false); context1.from(300); exception = expectThrows(IllegalArgumentException.class, () -> context1.preProcess(false)); assertThat(exception.getMessage(), equalTo("Batch size is too large, size must be less than or equal to: [" @@ -186,10 +186,11 @@ protected Engine.Searcher acquireSearcherInternal(String source) { + "] index level setting.")); readerContext.close(); - readerContext = new ReaderContext(randomNonNegativeLong(), indexShard, engineReader, randomNonNegativeLong(), false); + readerContext = new ReaderContext( + randomNonNegativeLong(), indexService, indexShard, engineReader, randomNonNegativeLong(), false); // rescore is null but sliceBuilder is not null DefaultSearchContext context2 = new DefaultSearchContext(readerContext, shardSearchRequest, target, - null, indexService, indexShard, bigArrays, null, timeout, null, false); + null, bigArrays, null, timeout, null, false); SliceBuilder sliceBuilder = mock(SliceBuilder.class); int numSlices = maxSlicesPerScroll + randomIntBetween(1, 100); @@ -206,7 +207,7 @@ protected Engine.Searcher acquireSearcherInternal(String source) { when(shardSearchRequest.indexBoost()).thenReturn(AbstractQueryBuilder.DEFAULT_BOOST); DefaultSearchContext context3 = new DefaultSearchContext(readerContext, shardSearchRequest, target, null, - indexService, indexShard, bigArrays, null, timeout, null, false); + bigArrays, null, timeout, null, false); ParsedQuery parsedQuery = ParsedQuery.parsedMatchAllQuery(); context3.sliceBuilder(null).parsedQuery(parsedQuery).preProcess(false); assertEquals(context3.query(), context3.buildFilteredQuery(parsedQuery.query())); @@ -216,9 +217,10 @@ protected Engine.Searcher acquireSearcherInternal(String source) { when(shardSearchRequest.indexRoutings()).thenReturn(new String[0]); readerContext.close(); - readerContext = new ReaderContext(randomNonNegativeLong(), indexShard, engineReader, randomNonNegativeLong(), false); - DefaultSearchContext context4 = new DefaultSearchContext(readerContext, shardSearchRequest, target, null, - indexService, indexShard, bigArrays, null, timeout, null, false); + readerContext = + new ReaderContext(randomNonNegativeLong(), indexService, indexShard, engineReader, randomNonNegativeLong(), false); + DefaultSearchContext context4 = + new DefaultSearchContext(readerContext, shardSearchRequest, target, null, bigArrays, null, timeout, null, false); context4.sliceBuilder(new SliceBuilder(1,2)).parsedQuery(parsedQuery).preProcess(false); Query query1 = context4.query(); context4.sliceBuilder(new SliceBuilder(0,2)).parsedQuery(parsedQuery).preProcess(false); diff --git a/server/src/test/java/org/elasticsearch/search/SearchServiceTests.java b/server/src/test/java/org/elasticsearch/search/SearchServiceTests.java index 033403fce0282..2fbc6b63325b8 100644 --- a/server/src/test/java/org/elasticsearch/search/SearchServiceTests.java +++ b/server/src/test/java/org/elasticsearch/search/SearchServiceTests.java @@ -415,7 +415,7 @@ public void testTimeout() throws IOException { new AliasFilter(null, Strings.EMPTY_ARRAY), 1.0f, -1, null, null); - try (ReaderContext reader = createReaderContext(indexShard); + try (ReaderContext reader = createReaderContext(indexService, indexShard); SearchContext contextWithDefaultTimeout = service.createContext(reader, requestWithDefaultTimeout, null, randomBoolean())) { // the search context should inherit the default timeout assertThat(contextWithDefaultTimeout.timeout(), equalTo(TimeValue.timeValueSeconds(5))); @@ -430,7 +430,7 @@ public void testTimeout() throws IOException { 1, new AliasFilter(null, Strings.EMPTY_ARRAY), 1.0f, -1, null, null); - try (ReaderContext reader = createReaderContext(indexShard); + try (ReaderContext reader = createReaderContext(indexService, indexShard); SearchContext context = service.createContext(reader, requestWithCustomTimeout, null, randomBoolean())) { // the search context should inherit the query timeout assertThat(context.timeout(), equalTo(TimeValue.timeValueSeconds(seconds))); @@ -456,12 +456,12 @@ public void testMaxDocvalueFieldsSearch() throws IOException { } final ShardSearchRequest request = new ShardSearchRequest(OriginalIndices.NONE, searchRequest, indexShard.shardId(), 1, new AliasFilter(null, Strings.EMPTY_ARRAY), 1.0f, -1, null, null); - try (ReaderContext reader = createReaderContext(indexShard); + try (ReaderContext reader = createReaderContext(indexService, indexShard); SearchContext context = service.createContext(reader, request, null, randomBoolean())) { assertNotNull(context); } searchSourceBuilder.docValueField("one_field_too_much"); - try (ReaderContext reader = createReaderContext(indexShard)) { + try (ReaderContext reader = createReaderContext(indexService, indexShard)) { IllegalArgumentException ex = expectThrows(IllegalArgumentException.class, () -> service.createContext(reader, request, null, randomBoolean())); assertEquals( @@ -493,7 +493,7 @@ public void testMaxScriptFieldsSearch() throws IOException { final ShardSearchRequest request = new ShardSearchRequest(OriginalIndices.NONE, searchRequest, indexShard.shardId(), 1, new AliasFilter(null, Strings.EMPTY_ARRAY), 1.0f, -1, null, null); - try(ReaderContext reader = createReaderContext(indexShard)) { + try(ReaderContext reader = createReaderContext(indexService, indexShard)) { try (SearchContext context = service.createContext(reader, request, null, randomBoolean())) { assertNotNull(context); } @@ -525,7 +525,7 @@ public void testIgnoreScriptfieldIfSizeZero() throws IOException { final ShardSearchRequest request = new ShardSearchRequest(OriginalIndices.NONE, searchRequest, indexShard.shardId(), 1, new AliasFilter(null, Strings.EMPTY_ARRAY), 1.0f, -1, null, null); - try (ReaderContext reader = createReaderContext(indexShard); + try (ReaderContext reader = createReaderContext(indexService, indexShard); SearchContext context = service.createContext(reader, request, null, randomBoolean())) { assertEquals(0, context.scriptFields().fields().size()); } @@ -562,7 +562,8 @@ public void testMaxOpenScrollContexts() throws Exception { final ShardScrollRequestTest request = new ShardScrollRequestTest(indexShard.shardId()); ElasticsearchException ex = expectThrows(ElasticsearchException.class, - () -> service.createAndPutReaderContext(request, indexShard, indexShard.acquireSearcherSupplier(), randomBoolean())); + () -> service.createAndPutReaderContext( + request, indexService, indexShard, indexShard.acquireSearcherSupplier(), randomBoolean())); assertEquals( "Trying to create too many scroll contexts. Must be less than or equal to: [" + SearchService.MAX_OPEN_SCROLL_CONTEXT.get(Settings.EMPTY) + "]. " + @@ -575,7 +576,8 @@ public void testMaxOpenScrollContexts() throws Exception { public void testOpenScrollContextsConcurrently() throws Exception { createIndex("index"); final IndicesService indicesService = getInstanceFromNode(IndicesService.class); - final IndexShard indexShard = indicesService.indexServiceSafe(resolveIndex("index")).getShard(0); + final IndexService indexService = indicesService.indexServiceSafe(resolveIndex("index")); + final IndexShard indexShard = indexService.getShard(0); final int maxScrollContexts = SearchService.MAX_OPEN_SCROLL_CONTEXT.get(Settings.EMPTY); final SearchService searchService = getInstanceFromNode(SearchService.class); @@ -590,7 +592,7 @@ public void testOpenScrollContextsConcurrently() throws Exception { Engine.SearcherSupplier reader = indexShard.acquireSearcherSupplier(); try { searchService.createAndPutReaderContext( - new ShardScrollRequestTest(indexShard.shardId()), indexShard, reader, true); + new ShardScrollRequestTest(indexShard.shardId()), indexService, indexShard, reader, true); reader = null; } catch (ElasticsearchException e) { assertThat(e.getMessage(), equalTo( @@ -889,7 +891,7 @@ public SearchType searchType() { throw new NullPointerException("expected"); } }; - try (ReaderContext reader = createReaderContext(indexService.getShard(shardId.id()))) { + try (ReaderContext reader = createReaderContext(indexService, indexService.getShard(shardId.id()))) { NullPointerException e = expectThrows(NullPointerException.class, () -> service.createContext(reader, request, null, randomBoolean())); assertEquals("expected", e.getMessage()); @@ -1047,7 +1049,7 @@ public void testLookUpSearchContext() throws Exception { ShardSearchRequest request = new ShardSearchRequest( OriginalIndices.NONE, new SearchRequest().allowPartialSearchResults(true), indexShard.shardId(), 1, new AliasFilter(null, Strings.EMPTY_ARRAY), 1.0f, -1, null, null); - final ReaderContext context = searchService.createAndPutReaderContext(request, indexShard, + final ReaderContext context = searchService.createAndPutReaderContext(request, indexService, indexShard, indexShard.acquireSearcherSupplier(), randomBoolean()); assertThat(context.id().getId(), equalTo((long) (i + 1))); contextIds.add(context.id()); @@ -1085,7 +1087,8 @@ public void testOpenReaderContext() { assertTrue(searchService.freeReaderContext(future.actionGet())); } - private ReaderContext createReaderContext(IndexShard shard) { - return new ReaderContext(randomNonNegativeLong(), shard, shard.acquireSearcherSupplier(), randomNonNegativeLong(), false); + private ReaderContext createReaderContext(IndexService indexService, IndexShard indexShard) { + return new ReaderContext(randomNonNegativeLong(), indexService, indexShard, + indexShard.acquireSearcherSupplier(), randomNonNegativeLong(), false); } } diff --git a/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/SecuritySearchOperationListenerTests.java b/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/SecuritySearchOperationListenerTests.java index 2b6c02021dba3..c1840ff26cda6 100644 --- a/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/SecuritySearchOperationListenerTests.java +++ b/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/SecuritySearchOperationListenerTests.java @@ -10,6 +10,7 @@ import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.util.concurrent.ThreadContext.StoredContext; +import org.elasticsearch.index.IndexService; import org.elasticsearch.index.shard.IndexShard; import org.elasticsearch.license.XPackLicenseState; import org.elasticsearch.license.XPackLicenseState.Feature; @@ -51,15 +52,18 @@ import static org.mockito.Mockito.when; public class SecuritySearchOperationListenerTests extends ESSingleNodeTestCase { + private IndexService indexService; private IndexShard shard; @Before public void setupShard() { - shard = createIndex("index").getShard(0); + indexService = createIndex("index"); + shard = indexService.getShard(0); } public void testUnlicensed() { - try (ReaderContext readerContext = new ReaderContext(0L, shard, shard.acquireSearcherSupplier(), Long.MAX_VALUE, false)) { + try (ReaderContext readerContext = + new ReaderContext(0L, indexService, shard, shard.acquireSearcherSupplier(), Long.MAX_VALUE, false)) { XPackLicenseState licenseState = mock(XPackLicenseState.class); when(licenseState.isSecurityEnabled()).thenReturn(false); ThreadContext threadContext = new ThreadContext(Settings.EMPTY); @@ -77,7 +81,8 @@ public void testUnlicensed() { } public void testOnNewContextSetsAuthentication() throws Exception { - try (ReaderContext readerContext = new ReaderContext(0L, shard, shard.acquireSearcherSupplier(), Long.MAX_VALUE, false)) { + try (ReaderContext readerContext = + new ReaderContext(0L, indexService, shard, shard.acquireSearcherSupplier(), Long.MAX_VALUE, false)) { XPackLicenseState licenseState = mock(XPackLicenseState.class); when(licenseState.isSecurityEnabled()).thenReturn(true); ThreadContext threadContext = new ThreadContext(Settings.EMPTY); @@ -101,11 +106,11 @@ public void testOnNewContextSetsAuthentication() throws Exception { public void testValidateSearchContext() throws Exception { final ReaderContext readerContext; if (randomBoolean()) { - readerContext = new ReaderContext(0L, shard, shard.acquireSearcherSupplier(), Long.MAX_VALUE, false); + readerContext = new ReaderContext(0L, indexService, shard, shard.acquireSearcherSupplier(), Long.MAX_VALUE, false); } else { ShardSearchRequest request = mock(ShardSearchRequest.class); when(request.scroll()).thenReturn(new Scroll(TimeValue.timeValueMinutes(between(1, 10)))); - readerContext = new LegacyReaderContext(0L, shard, shard.acquireSearcherSupplier(), request, Long.MAX_VALUE); + readerContext = new LegacyReaderContext(0L, indexService, shard, shard.acquireSearcherSupplier(), request, Long.MAX_VALUE); } try { readerContext.putInContext(AuthenticationField.AUTHENTICATION_KEY,