From 6d3f5a889665352261a98b8926a00e5a206b9c7a Mon Sep 17 00:00:00 2001 From: jimczi Date: Thu, 30 Sep 2021 12:36:51 +0200 Subject: [PATCH 01/18] Centralize access to original indices in the search action This change removes the transient OriginalIndices from the ShardSearchTarget class. It is replaced by an an helper function in the SearchPhaseContext to access the OriginalIndices per cluster alias. --- .../aggregations/TermsReduceBenchmark.java | 5 +-- .../client/core/CountResponseTests.java | 2 +- .../DiscountedCumulativeGainTests.java | 7 ++-- .../index/rankeval/EvalQueryQualityTests.java | 3 +- .../rankeval/ExpectedReciprocalRankTests.java | 3 +- .../rankeval/MeanReciprocalRankTests.java | 3 +- .../index/rankeval/PrecisionAtKTests.java | 7 ++-- .../index/rankeval/RankEvalResponseTests.java | 5 ++- .../index/rankeval/RecallAtKTests.java | 5 ++- .../search/AbstractSearchAsyncAction.java | 24 +++++++++---- .../search/CanMatchPreFilterSearchPhase.java | 3 +- .../action/search/DfsQueryPhase.java | 14 ++++---- .../action/search/FetchSearchPhase.java | 20 +++++------ .../action/search/SearchPhaseContext.java | 7 ++++ .../search/SearchScrollAsyncAction.java | 2 +- .../action/search/SearchShardIterator.java | 2 +- .../action/search/ShardSearchFailure.java | 3 +- .../TransportOpenPointInTimeAction.java | 6 ++-- .../action/search/TransportSearchAction.java | 4 +-- .../org/elasticsearch/search/SearchHit.java | 3 +- .../elasticsearch/search/SearchService.java | 3 +- .../search/SearchShardTarget.java | 12 +------ .../ElasticsearchExceptionTests.java | 36 +++++++++---------- .../ExceptionSerializationTests.java | 3 +- .../elasticsearch/ExceptionsHelperTests.java | 3 +- .../AbstractSearchAsyncActionTests.java | 4 +-- .../search/ClearScrollControllerTests.java | 12 +++---- .../action/search/CountedCollectorTests.java | 4 +-- .../action/search/DfsQueryPhaseTests.java | 20 +++++------ .../action/search/FetchSearchPhaseTests.java | 21 ++++++----- .../action/search/MockSearchPhaseContext.java | 5 +++ .../search/QueryPhaseResultConsumerTests.java | 3 +- .../search/SearchPhaseControllerTests.java | 33 +++++++++-------- .../SearchPhaseExecutionExceptionTests.java | 11 +++--- .../SearchQueryThenFetchAsyncActionTests.java | 8 ++--- .../search/SearchResponseMergerTests.java | 9 +++-- .../search/SearchScrollAsyncActionTests.java | 9 +++-- .../search/SearchShardIteratorTests.java | 1 - .../search/ShardSearchFailureTests.java | 7 ++-- .../search/TransportSearchHelperTests.java | 6 ++-- .../rest/BytesRestResponseTests.java | 5 ++- .../rest/action/RestActionsTests.java | 3 +- .../search/DefaultSearchContextTests.java | 5 ++- .../elasticsearch/search/SearchHitTests.java | 5 ++- .../elasticsearch/search/SearchHitsTests.java | 3 +- .../SearchProfileResultsBuilderTests.java | 2 +- .../search/query/QuerySearchResultTests.java | 3 +- .../elasticsearch/test/TestSearchContext.java | 3 +- .../xpack/search/AsyncSearchTaskTests.java | 5 ++- .../SeqNoPrimaryTermAndIndexTests.java | 2 +- .../CompareConditionSearchTests.java | 3 +- .../xpack/watcher/WatcherServiceTests.java | 3 +- .../execution/TriggeredWatchStoreTests.java | 5 ++- 53 files changed, 181 insertions(+), 204 deletions(-) diff --git a/benchmarks/src/main/java/org/elasticsearch/benchmark/search/aggregations/TermsReduceBenchmark.java b/benchmarks/src/main/java/org/elasticsearch/benchmark/search/aggregations/TermsReduceBenchmark.java index 56ea700792c82..5f01dde0c4266 100644 --- a/benchmarks/src/main/java/org/elasticsearch/benchmark/search/aggregations/TermsReduceBenchmark.java +++ b/benchmarks/src/main/java/org/elasticsearch/benchmark/search/aggregations/TermsReduceBenchmark.java @@ -11,7 +11,6 @@ import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.TotalHits; import org.apache.lucene.util.BytesRef; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.search.QueryPhaseResultConsumer; import org.elasticsearch.action.search.SearchPhaseController; import org.elasticsearch.action.search.SearchProgressListener; @@ -173,9 +172,7 @@ public SearchPhaseController.ReducedQueryPhase reduceAggs(TermsList candidateLis new DocValueFormat[] { DocValueFormat.RAW } ); result.aggregations(candidateList.get(i)); - result.setSearchShardTarget( - new SearchShardTarget("node", new ShardId(new Index("index", "index"), i), null, OriginalIndices.NONE) - ); + result.setSearchShardTarget(new SearchShardTarget("node", new ShardId(new Index("index", "index"), i), null)); shards.add(result); } SearchRequest request = new SearchRequest(); diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/core/CountResponseTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/core/CountResponseTests.java index 6c5efc0f57af9..cffec5c138906 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/core/CountResponseTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/core/CountResponseTests.java @@ -80,7 +80,7 @@ private static ShardSearchFailure createShardFailureTestItem() { String nodeId = randomAlphaOfLengthBetween(5, 10); String indexName = randomAlphaOfLengthBetween(5, 10); searchShardTarget = new SearchShardTarget(nodeId, - new ShardId(new Index(indexName, IndexMetadata.INDEX_UUID_NA_VALUE), randomInt()), null, null); + new ShardId(new Index(indexName, IndexMetadata.INDEX_UUID_NA_VALUE), randomInt()), null); } return new ShardSearchFailure(ex, searchShardTarget); } diff --git a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/DiscountedCumulativeGainTests.java b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/DiscountedCumulativeGainTests.java index e6998a8e3e788..9e372d1d314be 100644 --- a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/DiscountedCumulativeGainTests.java +++ b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/DiscountedCumulativeGainTests.java @@ -8,7 +8,6 @@ package org.elasticsearch.index.rankeval; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; @@ -62,7 +61,7 @@ public void testDCGAt() { for (int i = 0; i < 6; i++) { rated.add(new RatedDocument("index", Integer.toString(i), relevanceRatings[i])); hits[i] = new SearchHit(i, Integer.toString(i), Collections.emptyMap(), Collections.emptyMap()); - hits[i].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null, OriginalIndices.NONE)); + hits[i].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null)); } DiscountedCumulativeGain dcg = new DiscountedCumulativeGain(); assertEquals(EXPECTED_DCG, dcg.evaluate("id", hits, rated).metricScore(), DELTA); @@ -112,7 +111,7 @@ public void testDCGAtSixMissingRatings() { } } hits[i] = new SearchHit(i, Integer.toString(i), Collections.emptyMap(), Collections.emptyMap()); - hits[i].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null, OriginalIndices.NONE)); + hits[i].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null)); } DiscountedCumulativeGain dcg = new DiscountedCumulativeGain(); EvalQueryQuality result = dcg.evaluate("id", hits, rated); @@ -169,7 +168,7 @@ public void testDCGAtFourMoreRatings() { SearchHit[] hits = new SearchHit[4]; for (int i = 0; i < 4; i++) { hits[i] = new SearchHit(i, Integer.toString(i), Collections.emptyMap(), Collections.emptyMap()); - hits[i].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null, OriginalIndices.NONE)); + hits[i].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null)); } DiscountedCumulativeGain dcg = new DiscountedCumulativeGain(); EvalQueryQuality result = dcg.evaluate("id", hits, ratedDocs); diff --git a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/EvalQueryQualityTests.java b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/EvalQueryQualityTests.java index df130d83a6ae7..3737829b45b94 100644 --- a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/EvalQueryQualityTests.java +++ b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/EvalQueryQualityTests.java @@ -8,7 +8,6 @@ package org.elasticsearch.index.rankeval; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.xcontent.NamedXContentRegistry; @@ -46,7 +45,7 @@ public static EvalQueryQuality randomEvalQueryQuality() { for (int i = 0; i < numberOfSearchHits; i++) { RatedSearchHit ratedSearchHit = RatedSearchHitTests.randomRatedSearchHit(); // we need to associate each hit with an index name otherwise rendering will not work - ratedSearchHit.getSearchHit().shard(new SearchShardTarget("_na_", new ShardId("index", "_na_", 0), null, OriginalIndices.NONE)); + ratedSearchHit.getSearchHit().shard(new SearchShardTarget("_na_", new ShardId("index", "_na_", 0), null)); ratedHits.add(ratedSearchHit); } EvalQueryQuality evalQueryQuality = new EvalQueryQuality(randomAlphaOfLength(10), diff --git a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/ExpectedReciprocalRankTests.java b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/ExpectedReciprocalRankTests.java index 27f25931f0772..914c199650dc7 100644 --- a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/ExpectedReciprocalRankTests.java +++ b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/ExpectedReciprocalRankTests.java @@ -8,7 +8,6 @@ package org.elasticsearch.index.rankeval; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.xcontent.ToXContent; @@ -105,7 +104,7 @@ private SearchHit[] createSearchHits(List rated, Integer[] releva rated.add(new RatedDocument("index", Integer.toString(i), relevanceRatings[i])); } hits[i] = new SearchHit(i, Integer.toString(i), Collections.emptyMap(), Collections.emptyMap()); - hits[i].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null, OriginalIndices.NONE)); + hits[i].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null)); } return hits; } diff --git a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/MeanReciprocalRankTests.java b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/MeanReciprocalRankTests.java index 0e24830459ea8..de9dfea67ce32 100644 --- a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/MeanReciprocalRankTests.java +++ b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/MeanReciprocalRankTests.java @@ -8,7 +8,6 @@ package org.elasticsearch.index.rankeval; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.xcontent.ToXContent; @@ -193,7 +192,7 @@ private static SearchHit[] createSearchHits(int from, int to, String index) { SearchHit[] hits = new SearchHit[to + 1 - from]; for (int i = from; i <= to; i++) { hits[i] = new SearchHit(i, i + "", Collections.emptyMap(), Collections.emptyMap()); - hits[i].shard(new SearchShardTarget("testnode", new ShardId(index, "uuid", 0), null, OriginalIndices.NONE)); + hits[i].shard(new SearchShardTarget("testnode", new ShardId(index, "uuid", 0), null)); } return hits; } diff --git a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/PrecisionAtKTests.java b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/PrecisionAtKTests.java index b5ffc74c1051a..997f0b8d33d11 100644 --- a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/PrecisionAtKTests.java +++ b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/PrecisionAtKTests.java @@ -8,7 +8,6 @@ package org.elasticsearch.index.rankeval; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.xcontent.ToXContent; @@ -102,7 +101,7 @@ public void testIgnoreUnlabeled() { // add an unlabeled search hit SearchHit[] searchHits = Arrays.copyOf(toSearchHits(rated, "test"), 3); searchHits[2] = new SearchHit(2, "2", Collections.emptyMap(), Collections.emptyMap()); - searchHits[2].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null, OriginalIndices.NONE)); + searchHits[2].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null)); EvalQueryQuality evaluated = (new PrecisionAtK()).evaluate("id", searchHits, rated); assertEquals((double) 2 / 3, evaluated.metricScore(), 0.00001); @@ -121,7 +120,7 @@ public void testNoRatedDocs() throws Exception { SearchHit[] hits = new SearchHit[5]; for (int i = 0; i < 5; i++) { hits[i] = new SearchHit(i, i + "", Collections.emptyMap(), Collections.emptyMap()); - hits[i].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null, OriginalIndices.NONE)); + hits[i].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null)); } EvalQueryQuality evaluated = (new PrecisionAtK()).evaluate("id", hits, Collections.emptyList()); assertEquals(0.0d, evaluated.metricScore(), 0.00001); @@ -243,7 +242,7 @@ private static SearchHit[] toSearchHits(List rated, String index) SearchHit[] hits = new SearchHit[rated.size()]; for (int i = 0; i < rated.size(); i++) { hits[i] = new SearchHit(i, i + "", Collections.emptyMap(), Collections.emptyMap()); - hits[i].shard(new SearchShardTarget("testnode", new ShardId(index, "uuid", 0), null, OriginalIndices.NONE)); + hits[i].shard(new SearchShardTarget("testnode", new ShardId(index, "uuid", 0), null)); } return hits; } diff --git a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RankEvalResponseTests.java b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RankEvalResponseTests.java index ded5a321e9a51..39f51ad2e6ff8 100644 --- a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RankEvalResponseTests.java +++ b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RankEvalResponseTests.java @@ -9,7 +9,6 @@ package org.elasticsearch.index.rankeval; import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.search.SearchPhaseExecutionException; import org.elasticsearch.action.search.ShardSearchFailure; import org.elasticsearch.cluster.block.ClusterBlockException; @@ -58,7 +57,7 @@ public class RankEvalResponseTests extends ESTestCase { new IllegalArgumentException("Closed resource", new RuntimeException("Resource")), new SearchPhaseExecutionException("search", "all shards failed", new ShardSearchFailure[] { new ShardSearchFailure(new ParsingException(1, 2, "foobar", null), - new SearchShardTarget("node_1", new ShardId("foo", "_na_", 1), null, OriginalIndices.NONE)) }), + new SearchShardTarget("node_1", new ShardId("foo", "_na_", 1), null)) }), new ElasticsearchException("Parsing failed", new ParsingException(9, 42, "Wrong state", new NullPointerException("Unexpected null value"))) }; @@ -169,7 +168,7 @@ public void testToXContent() throws IOException { private static RatedSearchHit searchHit(String index, int docId, Integer rating) { SearchHit hit = new SearchHit(docId, docId + "", Collections.emptyMap(), Collections.emptyMap()); - hit.shard(new SearchShardTarget("testnode", new ShardId(index, "uuid", 0), null, OriginalIndices.NONE)); + hit.shard(new SearchShardTarget("testnode", new ShardId(index, "uuid", 0), null)); hit.score(1.0f); return new RatedSearchHit(hit, rating != null ? OptionalInt.of(rating) : OptionalInt.empty()); } diff --git a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RecallAtKTests.java b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RecallAtKTests.java index b17760f10879c..df4b9f15b2b2e 100644 --- a/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RecallAtKTests.java +++ b/modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RecallAtKTests.java @@ -8,7 +8,6 @@ package org.elasticsearch.index.rankeval; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.xcontent.ToXContent; @@ -104,7 +103,7 @@ public void testNoRatedDocs() throws Exception { SearchHit[] hits = new SearchHit[k]; for (int i = 0; i < k; i++) { hits[i] = new SearchHit(i, i + "", Collections.emptyMap(), Collections.emptyMap()); - hits[i].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null, OriginalIndices.NONE)); + hits[i].shard(new SearchShardTarget("testnode", new ShardId("index", "uuid", 0), null)); } EvalQueryQuality evaluated = (new RecallAtK()).evaluate("id", hits, Collections.emptyList()); @@ -226,7 +225,7 @@ private static SearchHit[] toSearchHits(List rated, String index) SearchHit[] hits = new SearchHit[rated.size()]; for (int i = 0; i < rated.size(); i++) { hits[i] = new SearchHit(i, i + "", Collections.emptyMap(), Collections.emptyMap()); - hits[i].shard(new SearchShardTarget("testnode", new ShardId(index, "uuid", 0), null, OriginalIndices.NONE)); + hits[i].shard(new SearchShardTarget("testnode", new ShardId(index, "uuid", 0), null)); } return hits; } diff --git a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java index b2d1d64c76a16..e79ad2a6f4c8d 100644 --- a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java @@ -17,11 +17,13 @@ import org.elasticsearch.Version; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.NoShardAvailableActionException; +import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.ShardOperationFailedException; import org.elasticsearch.action.search.TransportSearchAction.SearchTimeProvider; import org.elasticsearch.action.support.TransportActions; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.routing.GroupShardsIterator; +import org.elasticsearch.core.Nullable; import org.elasticsearch.core.Releasable; import org.elasticsearch.core.Releasables; import org.elasticsearch.common.util.concurrent.AbstractRunnable; @@ -41,6 +43,7 @@ import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -66,6 +69,8 @@ abstract class AbstractSearchAsyncAction exten private final Executor executor; private final ActionListener listener; private final SearchRequest request; + private final Map originalIndicesMap; + /** * Used by subclasses to resolve node ids to DiscoveryNodes. **/ @@ -106,13 +111,16 @@ abstract class AbstractSearchAsyncAction exten super(name); final List toSkipIterators = new ArrayList<>(); final List iterators = new ArrayList<>(); + Map originalIndices = new HashMap<>(); for (final SearchShardIterator iterator : shardsIts) { + originalIndices.putIfAbsent(iterator.getClusterAlias(), iterator.getOriginalIndices()); if (iterator.skip()) { toSkipIterators.add(iterator); } else { iterators.add(iterator); } } + this.originalIndicesMap = Collections.unmodifiableMap(originalIndices); this.toSkipShardsIts = new GroupShardsIterator<>(toSkipIterators); this.shardsIts = new GroupShardsIterator<>(iterators); this.shardItIndexMap = new HashMap<>(); @@ -287,8 +295,7 @@ protected void performPhaseOnShard(final int shardIndex, final SearchShardIterat */ if (shard == null) { assert assertExecuteOnStartThread(); - SearchShardTarget unassignedShard = new SearchShardTarget(null, shardIt.shardId(), - shardIt.getClusterAlias(), shardIt.getOriginalIndices()); + SearchShardTarget unassignedShard = new SearchShardTarget(null, shardIt.shardId(), shardIt.getClusterAlias()); onShardFailure(shardIndex, unassignedShard, shardIt, new NoShardAvailableActionException(shardIt.shardId())); } else { final PendingExecutions pendingExecutions = throttleConcurrentRequests ? @@ -608,6 +615,11 @@ public final SearchRequest getRequest() { return request; } + @Override + public OriginalIndices getOriginalIndices(@Nullable String clusterAlias) { + return originalIndicesMap.get(clusterAlias); + } + @Override public boolean isPartOfPointInTime(ShardSearchContextId contextId) { final PointInTimeBuilder pointInTimeBuilder = request.pointInTimeBuilder(); @@ -674,7 +686,7 @@ private void raisePhaseFailure(SearchPhaseExecutionException exception) { try { SearchShardTarget searchShardTarget = entry.getSearchShardTarget(); Transport.Connection connection = getConnection(searchShardTarget.getClusterAlias(), searchShardTarget.getNodeId()); - sendReleaseSearchContext(entry.getContextId(), connection, searchShardTarget.getOriginalIndices()); + sendReleaseSearchContext(entry.getContextId(), connection, getOriginalIndices(searchShardTarget.getClusterAlias())); } catch (Exception inner) { inner.addSuppressed(exception); logger.trace("failed to release context", inner); @@ -723,9 +735,9 @@ public final ShardSearchRequest buildShardSearchRequest(SearchShardIterator shar AliasFilter filter = aliasFilter.get(shardIt.shardId().getIndex().getUUID()); assert filter != null; float indexBoost = concreteIndexBoosts.getOrDefault(shardIt.shardId().getIndex().getUUID(), DEFAULT_INDEX_BOOST); - ShardSearchRequest shardRequest = new ShardSearchRequest(shardIt.getOriginalIndices(), request, shardIt.shardId(), shardIndex, - getNumShards(), filter, indexBoost, timeProvider.getAbsoluteStartMillis(), shardIt.getClusterAlias(), - shardIt.getSearchContextId(), shardIt.getSearchContextKeepAlive()); + ShardSearchRequest shardRequest = new ShardSearchRequest(shardIt.getOriginalIndices(), request, + shardIt.shardId(), shardIndex, getNumShards(), filter, indexBoost, timeProvider.getAbsoluteStartMillis(), + shardIt.getClusterAlias(), shardIt.getSearchContextId(), shardIt.getSearchContextKeepAlive()); // if we already received a search result we can inform the shard that it // can return a null response if the request rewrites to match none rather // than creating an empty response in the search thread pool. diff --git a/server/src/main/java/org/elasticsearch/action/search/CanMatchPreFilterSearchPhase.java b/server/src/main/java/org/elasticsearch/action/search/CanMatchPreFilterSearchPhase.java index 09ae052bd1d5e..97726626abe55 100644 --- a/server/src/main/java/org/elasticsearch/action/search/CanMatchPreFilterSearchPhase.java +++ b/server/src/main/java/org/elasticsearch/action/search/CanMatchPreFilterSearchPhase.java @@ -148,8 +148,7 @@ protected void performPhaseOnShard(int shardIndex, SearchShardIterator shardIt, } CanMatchResponse result = new CanMatchResponse(canMatch, null); - result.setSearchShardTarget(shard == null ? new SearchShardTarget(null, shardIt.shardId(), shardIt.getClusterAlias(), - shardIt.getOriginalIndices()) : shard); + result.setSearchShardTarget(shard == null ? new SearchShardTarget(null, shardIt.shardId(), shardIt.getClusterAlias()) : shard); result.setShardIndex(shardIndex); fork(() -> onShardResult(result, shardIt)); } catch (Exception e) { diff --git a/server/src/main/java/org/elasticsearch/action/search/DfsQueryPhase.java b/server/src/main/java/org/elasticsearch/action/search/DfsQueryPhase.java index 98204f19e9e96..1642972de9144 100644 --- a/server/src/main/java/org/elasticsearch/action/search/DfsQueryPhase.java +++ b/server/src/main/java/org/elasticsearch/action/search/DfsQueryPhase.java @@ -64,13 +64,13 @@ public void run() throws IOException { searchResults.size(), () -> context.executeNextPhase(this, nextPhaseFactory.apply(queryResult)), context); for (final DfsSearchResult dfsResult : searchResults) { - final SearchShardTarget searchShardTarget = dfsResult.getSearchShardTarget(); - Transport.Connection connection = context.getConnection(searchShardTarget.getClusterAlias(), searchShardTarget.getNodeId()); - QuerySearchRequest querySearchRequest = new QuerySearchRequest(searchShardTarget.getOriginalIndices(), + final SearchShardTarget shardTarget = dfsResult.getSearchShardTarget(); + Transport.Connection connection = context.getConnection(shardTarget.getClusterAlias(), shardTarget.getNodeId()); + QuerySearchRequest querySearchRequest = new QuerySearchRequest(context.getOriginalIndices(shardTarget.getClusterAlias()), dfsResult.getContextId(), dfsResult.getShardSearchRequest(), dfs); final int shardIndex = dfsResult.getShardIndex(); searchTransportService.sendExecuteQuery(connection, querySearchRequest, context.getTask(), - new SearchActionListener(searchShardTarget, shardIndex) { + new SearchActionListener(shardTarget, shardIndex) { @Override protected void innerOnResponse(QuerySearchResult response) { @@ -86,15 +86,15 @@ public void onFailure(Exception exception) { try { context.getLogger().debug(() -> new ParameterizedMessage("[{}] Failed to execute query phase", querySearchRequest.contextId()), exception); - progressListener.notifyQueryFailure(shardIndex, searchShardTarget, exception); - counter.onFailure(shardIndex, searchShardTarget, exception); + progressListener.notifyQueryFailure(shardIndex, shardTarget, exception); + counter.onFailure(shardIndex, shardTarget, exception); } finally { if (context.isPartOfPointInTime(querySearchRequest.contextId()) == false) { // the query might not have been executed at all (for example because thread pool rejected // execution) and the search context that was created in dfs phase might not be released. // release it again to be in the safe side context.sendReleaseSearchContext( - querySearchRequest.contextId(), connection, searchShardTarget.getOriginalIndices()); + querySearchRequest.contextId(), connection, context.getOriginalIndices(shardTarget.getClusterAlias())); } } } diff --git a/server/src/main/java/org/elasticsearch/action/search/FetchSearchPhase.java b/server/src/main/java/org/elasticsearch/action/search/FetchSearchPhase.java index f944feae10fa4..8f423b673d142 100644 --- a/server/src/main/java/org/elasticsearch/action/search/FetchSearchPhase.java +++ b/server/src/main/java/org/elasticsearch/action/search/FetchSearchPhase.java @@ -136,14 +136,13 @@ private void innerRun() throws Exception { // in any case we count down this result since we don't talk to this shard anymore counter.countDown(); } else { - SearchShardTarget searchShardTarget = queryResult.getSearchShardTarget(); - Transport.Connection connection = context.getConnection(searchShardTarget.getClusterAlias(), - searchShardTarget.getNodeId()); + SearchShardTarget shardTarget = queryResult.getSearchShardTarget(); + Transport.Connection connection = context.getConnection(shardTarget.getClusterAlias(), shardTarget.getNodeId()); ShardFetchSearchRequest fetchSearchRequest = createFetchRequest(queryResult.queryResult().getContextId(), i, entry, - lastEmittedDocPerShard, searchShardTarget.getOriginalIndices(), queryResult.getShardSearchRequest(), - queryResult.getRescoreDocIds()); - executeFetch(queryResult.getShardIndex(), searchShardTarget, counter, fetchSearchRequest, queryResult.queryResult(), - connection); + lastEmittedDocPerShard, context.getOriginalIndices(shardTarget.getClusterAlias()), + queryResult.getShardSearchRequest(), queryResult.getRescoreDocIds()); + executeFetch(queryResult.getShardIndex(), shardTarget, counter, fetchSearchRequest, + queryResult.queryResult(), connection); } } } @@ -201,9 +200,10 @@ private void releaseIrrelevantSearchContext(QuerySearchResult queryResult) { && context.getRequest().scroll() == null && (context.isPartOfPointInTime(queryResult.getContextId()) == false)) { try { - SearchShardTarget searchShardTarget = queryResult.getSearchShardTarget(); - Transport.Connection connection = context.getConnection(searchShardTarget.getClusterAlias(), searchShardTarget.getNodeId()); - context.sendReleaseSearchContext(queryResult.getContextId(), connection, searchShardTarget.getOriginalIndices()); + SearchShardTarget shardTarget = queryResult.getSearchShardTarget(); + Transport.Connection connection = context.getConnection(shardTarget.getClusterAlias(), shardTarget.getNodeId()); + context.sendReleaseSearchContext(queryResult.getContextId(), connection, + context.getOriginalIndices(shardTarget.getClusterAlias())); } catch (Exception e) { context.getLogger().trace("failed to release context", e); } diff --git a/server/src/main/java/org/elasticsearch/action/search/SearchPhaseContext.java b/server/src/main/java/org/elasticsearch/action/search/SearchPhaseContext.java index c0f2cf32aa6b6..5befaf5582b78 100644 --- a/server/src/main/java/org/elasticsearch/action/search/SearchPhaseContext.java +++ b/server/src/main/java/org/elasticsearch/action/search/SearchPhaseContext.java @@ -47,6 +47,13 @@ interface SearchPhaseContext extends Executor { */ SearchRequest getRequest(); + /** + * Returns the targeted {@link OriginalIndices} for the provided cluster alias or the local cluster + * if {@code clusterAlias} is {@code null}. + * or the local cluster + */ + OriginalIndices getOriginalIndices(@Nullable String clusterAlias); + /** * Checks if the given context id is part of the point in time of this search (if exists). * We should not release search contexts that belong to the point in time during or after searches. diff --git a/server/src/main/java/org/elasticsearch/action/search/SearchScrollAsyncAction.java b/server/src/main/java/org/elasticsearch/action/search/SearchScrollAsyncAction.java index a2b5a92d1d07f..49067379983f5 100644 --- a/server/src/main/java/org/elasticsearch/action/search/SearchScrollAsyncAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/SearchScrollAsyncAction.java @@ -141,7 +141,7 @@ protected void setSearchShardTarget(T response) { // we need this down the road for subseq. phases SearchShardTarget searchShardTarget = response.getSearchShardTarget(); response.setSearchShardTarget(new SearchShardTarget(searchShardTarget.getNodeId(), searchShardTarget.getShardId(), - target.getClusterAlias(), null)); + target.getClusterAlias())); } } diff --git a/server/src/main/java/org/elasticsearch/action/search/SearchShardIterator.java b/server/src/main/java/org/elasticsearch/action/search/SearchShardIterator.java index 63ae879a58904..a3fc006e6fc92 100644 --- a/server/src/main/java/org/elasticsearch/action/search/SearchShardIterator.java +++ b/server/src/main/java/org/elasticsearch/action/search/SearchShardIterator.java @@ -85,7 +85,7 @@ public String getClusterAlias() { SearchShardTarget nextOrNull() { final String nodeId = targetNodesIterator.nextOrNull(); if (nodeId != null) { - return new SearchShardTarget(nodeId, shardId, clusterAlias, originalIndices); + return new SearchShardTarget(nodeId, shardId, clusterAlias); } return null; } diff --git a/server/src/main/java/org/elasticsearch/action/search/ShardSearchFailure.java b/server/src/main/java/org/elasticsearch/action/search/ShardSearchFailure.java index 4925f8a3f3b56..78fafba25c041 100644 --- a/server/src/main/java/org/elasticsearch/action/search/ShardSearchFailure.java +++ b/server/src/main/java/org/elasticsearch/action/search/ShardSearchFailure.java @@ -10,7 +10,6 @@ import org.elasticsearch.ElasticsearchException; import org.elasticsearch.ExceptionsHelper; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.ShardOperationFailedException; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.core.Nullable; @@ -158,7 +157,7 @@ public static ShardSearchFailure fromXContent(XContentParser parser) throws IOEx SearchShardTarget searchShardTarget = null; if (nodeId != null) { searchShardTarget = new SearchShardTarget(nodeId, - new ShardId(new Index(indexName, IndexMetadata.INDEX_UUID_NA_VALUE), shardId), clusterAlias, OriginalIndices.NONE); + new ShardId(new Index(indexName, IndexMetadata.INDEX_UUID_NA_VALUE), shardId), clusterAlias); } return new ShardSearchFailure(exception, searchShardTarget); } diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportOpenPointInTimeAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportOpenPointInTimeAction.java index c954debf85184..3db8f9017fde0 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportOpenPointInTimeAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportOpenPointInTimeAction.java @@ -79,10 +79,10 @@ protected void doExecute(Task task, OpenPointInTimeRequest request, ActionListen searchRequest, "open_search_context", true, - (searchTask, shardTarget, connection, phaseListener) -> { + (searchTask, shardIt, connection, phaseListener) -> { final ShardOpenReaderRequest shardRequest = new ShardOpenReaderRequest( - shardTarget.getShardId(), - shardTarget.getOriginalIndices(), + shardIt.shardId(), + shardIt.getOriginalIndices(), request.keepAlive() ); transportService.sendChildRequest( diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index e3c9608c808f9..c9fc1f33288e0 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -225,7 +225,7 @@ protected void doExecute(Task task, SearchRequest searchRequest, ActionListener< } public interface SinglePhaseSearchAction { - void executeOnShardTarget(SearchTask searchTask, SearchShardTarget target, Transport.Connection connection, + void executeOnShardTarget(SearchTask searchTask, SearchShardIterator shardIt, Transport.Connection connection, ActionListener listener); } @@ -248,7 +248,7 @@ public AbstractSearchAsyncAction asyncSearchAction( protected void executePhaseOnShard(SearchShardIterator shardIt, SearchShardTarget shard, SearchActionListener listener) { final Transport.Connection connection = getConnection(shard.getClusterAlias(), shard.getNodeId()); - phaseSearchAction.executeOnShardTarget(task, shard, connection, listener); + phaseSearchAction.executeOnShardTarget(task, shardIt, connection, listener); } @Override diff --git a/server/src/main/java/org/elasticsearch/search/SearchHit.java b/server/src/main/java/org/elasticsearch/search/SearchHit.java index 3a9c7cf697ad6..280197b0c7d6f 100644 --- a/server/src/main/java/org/elasticsearch/search/SearchHit.java +++ b/server/src/main/java/org/elasticsearch/search/SearchHit.java @@ -11,7 +11,6 @@ import org.apache.lucene.search.Explanation; import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.Version; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.core.Nullable; import org.elasticsearch.common.xcontent.ParseField; import org.elasticsearch.common.ParsingException; @@ -787,7 +786,7 @@ public static SearchHit createFromMap(Map values) { String nodeId = get(Fields._NODE, values, null); if (shardId != null && nodeId != null) { assert shardId.getIndexName().equals(index); - searchHit.shard(new SearchShardTarget(nodeId, shardId, clusterAlias, OriginalIndices.NONE)); + searchHit.shard(new SearchShardTarget(nodeId, shardId, clusterAlias)); } else { //these fields get set anyways when setting the shard target, //but we set them explicitly when we don't have enough info to rebuild the shard target diff --git a/server/src/main/java/org/elasticsearch/search/SearchService.java b/server/src/main/java/org/elasticsearch/search/SearchService.java index 6b3c456ef18bc..61fc39b51470e 100644 --- a/server/src/main/java/org/elasticsearch/search/SearchService.java +++ b/server/src/main/java/org/elasticsearch/search/SearchService.java @@ -18,7 +18,6 @@ import org.elasticsearch.Version; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionRunnable; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchShardTask; import org.elasticsearch.action.search.SearchType; @@ -807,7 +806,7 @@ private DefaultSearchContext createSearchContext(ReaderContext reader, ShardSear DefaultSearchContext searchContext = null; try { SearchShardTarget shardTarget = new SearchShardTarget(clusterService.localNode().getId(), - reader.indexShard().shardId(), request.getClusterAlias(), OriginalIndices.NONE); + reader.indexShard().shardId(), request.getClusterAlias()); searchContext = new DefaultSearchContext(reader, request, shardTarget, threadPool::relativeTimeInMillis, timeout, fetchPhase, lowLevelCancellation); // we clone the query shard context here just for rewriting otherwise we diff --git a/server/src/main/java/org/elasticsearch/search/SearchShardTarget.java b/server/src/main/java/org/elasticsearch/search/SearchShardTarget.java index 98e1cc97f6d46..974829c985dd2 100644 --- a/server/src/main/java/org/elasticsearch/search/SearchShardTarget.java +++ b/server/src/main/java/org/elasticsearch/search/SearchShardTarget.java @@ -8,7 +8,6 @@ package org.elasticsearch.search; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.core.Nullable; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -27,9 +26,6 @@ public final class SearchShardTarget implements Writeable, Comparable randomExceptions() { actual = new SearchPhaseExecutionException("search", "all shards failed", new ShardSearchFailure[]{ new ShardSearchFailure(new ParsingException(1, 2, "foobar", null), - new SearchShardTarget("node_1", new ShardId("foo", "_na_", 1), null, OriginalIndices.NONE)) + new SearchShardTarget("node_1", new ShardId("foo", "_na_", 1), null)) }); expected = new ElasticsearchException("Elasticsearch exception [type=search_phase_execution_exception, " + "reason=all shards failed]"); diff --git a/server/src/test/java/org/elasticsearch/ExceptionSerializationTests.java b/server/src/test/java/org/elasticsearch/ExceptionSerializationTests.java index 6e6f3a7aed5d1..859548871b538 100644 --- a/server/src/test/java/org/elasticsearch/ExceptionSerializationTests.java +++ b/server/src/test/java/org/elasticsearch/ExceptionSerializationTests.java @@ -13,7 +13,6 @@ import org.apache.lucene.store.AlreadyClosedException; import org.apache.lucene.store.LockObtainFailedException; import org.elasticsearch.action.FailedNodeException; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.RoutingMissingException; import org.elasticsearch.action.TimestampParsingException; import org.elasticsearch.action.search.SearchPhaseExecutionException; @@ -277,7 +276,7 @@ public void testQueryShardException() throws IOException { } public void testSearchException() throws IOException { - SearchShardTarget target = new SearchShardTarget("foo", new ShardId("bar", "_na_", 1), null, OriginalIndices.NONE); + SearchShardTarget target = new SearchShardTarget("foo", new ShardId("bar", "_na_", 1), null); SearchException ex = serialize(new SearchException(target, "hello world")); assertEquals(target, ex.shard()); assertEquals(ex.getMessage(), "hello world"); diff --git a/server/src/test/java/org/elasticsearch/ExceptionsHelperTests.java b/server/src/test/java/org/elasticsearch/ExceptionsHelperTests.java index 0e47493150c95..212117e8d41c9 100644 --- a/server/src/test/java/org/elasticsearch/ExceptionsHelperTests.java +++ b/server/src/test/java/org/elasticsearch/ExceptionsHelperTests.java @@ -11,7 +11,6 @@ import com.fasterxml.jackson.core.JsonParseException; import org.apache.commons.codec.DecoderException; import org.apache.lucene.index.CorruptIndexException; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.ShardOperationFailedException; import org.elasticsearch.action.search.ShardSearchFailure; import org.elasticsearch.cluster.metadata.IndexMetadata; @@ -123,7 +122,7 @@ private static ShardSearchFailure createShardFailureParsingException(String erro private static SearchShardTarget createSearchShardTarget(String nodeId, int shardId, String index, String clusterAlias) { return new SearchShardTarget(nodeId, - new ShardId(new Index(index, IndexMetadata.INDEX_UUID_NA_VALUE), shardId), clusterAlias, OriginalIndices.NONE); + new ShardId(new Index(index, IndexMetadata.INDEX_UUID_NA_VALUE), shardId), clusterAlias); } public void testGroupByNullTarget() { diff --git a/server/src/test/java/org/elasticsearch/action/search/AbstractSearchAsyncActionTests.java b/server/src/test/java/org/elasticsearch/action/search/AbstractSearchAsyncActionTests.java index 51d1d9b2637c7..a55a3a3ce4a75 100644 --- a/server/src/test/java/org/elasticsearch/action/search/AbstractSearchAsyncActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/AbstractSearchAsyncActionTests.java @@ -159,7 +159,7 @@ public void testSendSearchResponseDisallowPartialFailures() { ShardId failureShardId = new ShardId("index", "index-uuid", i); String failureClusterAlias = randomBoolean() ? null : randomAlphaOfLengthBetween(5, 10); String failureNodeId = randomAlphaOfLengthBetween(5, 10); - action.onShardFailure(i, new SearchShardTarget(failureNodeId, failureShardId, failureClusterAlias, OriginalIndices.NONE), + action.onShardFailure(i, new SearchShardTarget(failureNodeId, failureShardId, failureClusterAlias), new IllegalArgumentException()); } action.sendSearchResponse(InternalSearchResponse.empty(), phaseResults.results); @@ -235,7 +235,7 @@ private static ArraySearchPhaseResults phaseResults(Set {}); } diff --git a/server/src/test/java/org/elasticsearch/action/search/ClearScrollControllerTests.java b/server/src/test/java/org/elasticsearch/action/search/ClearScrollControllerTests.java index 280af9ad7d2cc..39667c81f3cdc 100644 --- a/server/src/test/java/org/elasticsearch/action/search/ClearScrollControllerTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/ClearScrollControllerTests.java @@ -85,13 +85,13 @@ public void testClearScrollIds() throws IOException, InterruptedException { AtomicArray array = new AtomicArray<>(3); SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult1 = new SearchAsyncActionTests.TestSearchPhaseResult(new ShardSearchContextId(UUIDs.randomBase64UUID(), 1), node1); - testSearchPhaseResult1.setSearchShardTarget(new SearchShardTarget("node_1", new ShardId("idx", "uuid1", 2), null, null)); + testSearchPhaseResult1.setSearchShardTarget(new SearchShardTarget("node_1", new ShardId("idx", "uuid1", 2), null)); SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult2 = new SearchAsyncActionTests.TestSearchPhaseResult(new ShardSearchContextId(UUIDs.randomBase64UUID(), 12), node2); - testSearchPhaseResult2.setSearchShardTarget(new SearchShardTarget("node_2", new ShardId("idy", "uuid2", 42), null, null)); + testSearchPhaseResult2.setSearchShardTarget(new SearchShardTarget("node_2", new ShardId("idy", "uuid2", 42), null)); SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult3 = new SearchAsyncActionTests.TestSearchPhaseResult(new ShardSearchContextId(UUIDs.randomBase64UUID(), 42), node3); - testSearchPhaseResult3.setSearchShardTarget(new SearchShardTarget("node_3", new ShardId("idy", "uuid2", 43), null, null)); + testSearchPhaseResult3.setSearchShardTarget(new SearchShardTarget("node_3", new ShardId("idy", "uuid2", 43), null)); array.setOnce(0, testSearchPhaseResult1); array.setOnce(1, testSearchPhaseResult2); array.setOnce(2, testSearchPhaseResult3); @@ -149,13 +149,13 @@ public void testClearScrollIdsWithFailure() throws IOException, InterruptedExcep AtomicArray array = new AtomicArray<>(3); SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult1 = new SearchAsyncActionTests.TestSearchPhaseResult(new ShardSearchContextId(UUIDs.randomBase64UUID(), 1), node1); - testSearchPhaseResult1.setSearchShardTarget(new SearchShardTarget("node_1", new ShardId("idx", "uuid1", 2), null, null)); + testSearchPhaseResult1.setSearchShardTarget(new SearchShardTarget("node_1", new ShardId("idx", "uuid1", 2), null)); SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult2 = new SearchAsyncActionTests.TestSearchPhaseResult(new ShardSearchContextId(UUIDs.randomBase64UUID(), 12), node2); - testSearchPhaseResult2.setSearchShardTarget(new SearchShardTarget("node_2", new ShardId("idy", "uuid2", 42), null, null)); + testSearchPhaseResult2.setSearchShardTarget(new SearchShardTarget("node_2", new ShardId("idy", "uuid2", 42), null)); SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult3 = new SearchAsyncActionTests.TestSearchPhaseResult(new ShardSearchContextId(UUIDs.randomBase64UUID(), 42), node3); - testSearchPhaseResult3.setSearchShardTarget(new SearchShardTarget("node_3", new ShardId("idy", "uuid2", 43), null, null)); + testSearchPhaseResult3.setSearchShardTarget(new SearchShardTarget("node_3", new ShardId("idy", "uuid2", 43), null)); array.setOnce(0, testSearchPhaseResult1); array.setOnce(1, testSearchPhaseResult2); array.setOnce(2, testSearchPhaseResult3); diff --git a/server/src/test/java/org/elasticsearch/action/search/CountedCollectorTests.java b/server/src/test/java/org/elasticsearch/action/search/CountedCollectorTests.java index a46fb722d1733..02b54751a7bd9 100644 --- a/server/src/test/java/org/elasticsearch/action/search/CountedCollectorTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/CountedCollectorTests.java @@ -54,13 +54,13 @@ public void testCollect() throws InterruptedException { new ShardSearchContextId(UUIDs.randomBase64UUID(), shardID), null, null); dfsSearchResult.setShardIndex(shardID); dfsSearchResult.setSearchShardTarget(new SearchShardTarget("foo", - new ShardId("bar", "baz", shardID), null, OriginalIndices.NONE)); + new ShardId("bar", "baz", shardID), null)); collector.onResult(dfsSearchResult);}); break; case 2: state.add(2); executor.execute(() -> collector.onFailure(shardID, new SearchShardTarget("foo", new ShardId("bar", "baz", shardID), - null, OriginalIndices.NONE), new RuntimeException("boom"))); + null), new RuntimeException("boom"))); break; default: fail("unknown state"); diff --git a/server/src/test/java/org/elasticsearch/action/search/DfsQueryPhaseTests.java b/server/src/test/java/org/elasticsearch/action/search/DfsQueryPhaseTests.java index a1eac48701d2a..0020769846781 100644 --- a/server/src/test/java/org/elasticsearch/action/search/DfsQueryPhaseTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/DfsQueryPhaseTests.java @@ -47,9 +47,9 @@ public void testDfsWith2Shards() throws IOException { AtomicArray results = new AtomicArray<>(2); AtomicReference> responseRef = new AtomicReference<>(); results.set(0, newSearchResult(0, new ShardSearchContextId("", 1), - new SearchShardTarget("node1", new ShardId("test", "na", 0), null, OriginalIndices.NONE))); + new SearchShardTarget("node1", new ShardId("test", "na", 0), null))); results.set(1, newSearchResult(1, new ShardSearchContextId("", 2), - new SearchShardTarget("node2", new ShardId("test", "na", 0), null, OriginalIndices.NONE))); + new SearchShardTarget("node2", new ShardId("test", "na", 0), null))); results.get(0).termsStatistics(new Term[0], new TermStatistics[0]); results.get(1).termsStatistics(new Term[0], new TermStatistics[0]); @@ -59,7 +59,7 @@ public void sendExecuteQuery(Transport.Connection connection, QuerySearchRequest SearchActionListener listener) { if (request.contextId().getId() == 1) { QuerySearchResult queryResult = new QuerySearchResult(new ShardSearchContextId("", 123), - new SearchShardTarget("node1", new ShardId("test", "na", 0), null, OriginalIndices.NONE), null); + new SearchShardTarget("node1", new ShardId("test", "na", 0), null), null); queryResult.topDocs(new TopDocsAndMaxScore( new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(42, 1.0F)}), 2.0F), new DocValueFormat[0]); @@ -67,7 +67,7 @@ public void sendExecuteQuery(Transport.Connection connection, QuerySearchRequest listener.onResponse(queryResult); } else if (request.contextId().getId() == 2) { QuerySearchResult queryResult = new QuerySearchResult(new ShardSearchContextId("", 123), - new SearchShardTarget("node2", new ShardId("test", "na", 0), null, OriginalIndices.NONE), null); + new SearchShardTarget("node2", new ShardId("test", "na", 0), null), null); queryResult.topDocs(new TopDocsAndMaxScore( new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(84, 2.0F)}), 2.0F), new DocValueFormat[0]); @@ -111,9 +111,9 @@ public void testDfsWith1ShardFailed() throws IOException { AtomicArray results = new AtomicArray<>(2); AtomicReference> responseRef = new AtomicReference<>(); results.set(0, newSearchResult(0, new ShardSearchContextId("", 1), - new SearchShardTarget("node1", new ShardId("test", "na", 0), null, OriginalIndices.NONE))); + new SearchShardTarget("node1", new ShardId("test", "na", 0), null))); results.set(1, newSearchResult(1, new ShardSearchContextId("", 2), - new SearchShardTarget("node2", new ShardId("test", "na", 0), null, OriginalIndices.NONE))); + new SearchShardTarget("node2", new ShardId("test", "na", 0), null))); results.get(0).termsStatistics(new Term[0], new TermStatistics[0]); results.get(1).termsStatistics(new Term[0], new TermStatistics[0]); @@ -124,7 +124,7 @@ public void sendExecuteQuery(Transport.Connection connection, QuerySearchRequest if (request.contextId().getId() == 1) { QuerySearchResult queryResult = new QuerySearchResult(new ShardSearchContextId("", 123), new SearchShardTarget("node1", new ShardId("test", "na", 0), - null, OriginalIndices.NONE), null); + null), null); queryResult.topDocs(new TopDocsAndMaxScore(new TopDocs( new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(42, 1.0F)}), 2.0F), new DocValueFormat[0]); @@ -173,9 +173,9 @@ public void testFailPhaseOnException() throws IOException { AtomicArray results = new AtomicArray<>(2); AtomicReference> responseRef = new AtomicReference<>(); results.set(0, newSearchResult(0, new ShardSearchContextId("", 1), - new SearchShardTarget("node1", new ShardId("test", "na", 0), null, OriginalIndices.NONE))); + new SearchShardTarget("node1", new ShardId("test", "na", 0), null))); results.set(1, newSearchResult(1, new ShardSearchContextId("", 2), - new SearchShardTarget("node2", new ShardId("test", "na", 0), null, OriginalIndices.NONE))); + new SearchShardTarget("node2", new ShardId("test", "na", 0), null))); results.get(0).termsStatistics(new Term[0], new TermStatistics[0]); results.get(1).termsStatistics(new Term[0], new TermStatistics[0]); @@ -185,7 +185,7 @@ public void sendExecuteQuery(Transport.Connection connection, QuerySearchRequest SearchActionListener listener) { if (request.contextId().getId() == 1) { QuerySearchResult queryResult = new QuerySearchResult(new ShardSearchContextId("", 123), - new SearchShardTarget("node1", new ShardId("test", "na", 0), null, OriginalIndices.NONE), null); + new SearchShardTarget("node1", new ShardId("test", "na", 0), null), null); queryResult.topDocs(new TopDocsAndMaxScore( new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(42, 1.0F)}), 2.0F), new DocValueFormat[0]); diff --git a/server/src/test/java/org/elasticsearch/action/search/FetchSearchPhaseTests.java b/server/src/test/java/org/elasticsearch/action/search/FetchSearchPhaseTests.java index 6a7326bc071db..2166380da87f3 100644 --- a/server/src/test/java/org/elasticsearch/action/search/FetchSearchPhaseTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/FetchSearchPhaseTests.java @@ -11,7 +11,6 @@ import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.TotalHits; import org.apache.lucene.store.MockDirectoryWrapper; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.UUIDs; import org.elasticsearch.common.breaker.CircuitBreaker; import org.elasticsearch.common.breaker.NoopCircuitBreaker; @@ -57,7 +56,7 @@ public void testShortcutQueryAndFetchOptimization() { if (hasHits) { QuerySearchResult queryResult = new QuerySearchResult(); queryResult.setSearchShardTarget(new SearchShardTarget("node0", - new ShardId("index", "index", 0), null, OriginalIndices.NONE)); + new ShardId("index", "index", 0), null)); queryResult.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(42, 1.0F)}), 1.0F), new DocValueFormat[0]); addProfiling(profiled, queryResult); @@ -115,7 +114,7 @@ public void testFetchTwoDocument() { boolean profiled = randomBoolean(); ShardSearchContextId ctx1 = new ShardSearchContextId(UUIDs.base64UUID(), 123); - SearchShardTarget shard1Target = new SearchShardTarget("node1", new ShardId("test", "na", 0), null, OriginalIndices.NONE); + SearchShardTarget shard1Target = new SearchShardTarget("node1", new ShardId("test", "na", 0), null); QuerySearchResult queryResult = new QuerySearchResult(ctx1, shard1Target, null); queryResult.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(42, 1.0F)}), 2.0F), new DocValueFormat[0]); @@ -125,7 +124,7 @@ public void testFetchTwoDocument() { results.consumeResult(queryResult, () -> {}); final ShardSearchContextId ctx2 = new ShardSearchContextId(UUIDs.base64UUID(), 321); - SearchShardTarget shard2Target = new SearchShardTarget("node2", new ShardId("test", "na", 1), null, OriginalIndices.NONE); + SearchShardTarget shard2Target = new SearchShardTarget("node2", new ShardId("test", "na", 1), null); queryResult = new QuerySearchResult(ctx2, shard2Target, null); queryResult.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(84, 2.0F)}), 2.0F), new DocValueFormat[0]); @@ -183,7 +182,7 @@ public void testFailFetchOneDoc() { boolean profiled = randomBoolean(); final ShardSearchContextId ctx = new ShardSearchContextId(UUIDs.base64UUID(), 123); - SearchShardTarget shard1Target = new SearchShardTarget("node1", new ShardId("test", "na", 0), null, OriginalIndices.NONE); + SearchShardTarget shard1Target = new SearchShardTarget("node1", new ShardId("test", "na", 0), null); QuerySearchResult queryResult = new QuerySearchResult(ctx, shard1Target, null); queryResult.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(42, 1.0F)}), 2.0F), new DocValueFormat[0]); @@ -192,7 +191,7 @@ public void testFailFetchOneDoc() { addProfiling(profiled, queryResult); results.consumeResult(queryResult, () -> {}); - SearchShardTarget shard2Target = new SearchShardTarget("node2", new ShardId("test", "na", 1), null, OriginalIndices.NONE); + SearchShardTarget shard2Target = new SearchShardTarget("node2", new ShardId("test", "na", 1), null); queryResult = new QuerySearchResult(new ShardSearchContextId("", 321), shard2Target, null); queryResult.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(84, 2.0F)}), 2.0F), new DocValueFormat[0]); @@ -270,7 +269,7 @@ public void testFetchDocsConcurrently() throws InterruptedException { mockSearchPhaseContext.getRequest(), numHits, exc -> {}); SearchShardTarget[] shardTargets = new SearchShardTarget[numHits]; for (int i = 0; i < numHits; i++) { - shardTargets[i] = new SearchShardTarget("node1", new ShardId("test", "na", i), null, OriginalIndices.NONE); + shardTargets[i] = new SearchShardTarget("node1", new ShardId("test", "na", i), null); QuerySearchResult queryResult = new QuerySearchResult(new ShardSearchContextId("", i), shardTargets[i], null); queryResult.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(i+1, i)}), i), new DocValueFormat[0]); @@ -349,7 +348,7 @@ public void testExceptionFailsPhase() { int resultSetSize = randomIntBetween(2, 10); boolean profiled = randomBoolean(); - SearchShardTarget shard1Target = new SearchShardTarget("node1", new ShardId("test", "na", 0), null, OriginalIndices.NONE); + SearchShardTarget shard1Target = new SearchShardTarget("node1", new ShardId("test", "na", 0), null); QuerySearchResult queryResult = new QuerySearchResult(new ShardSearchContextId("", 123), shard1Target, null); queryResult.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(42, 1.0F)}), 2.0F), new DocValueFormat[0]); @@ -358,7 +357,7 @@ public void testExceptionFailsPhase() { addProfiling(profiled, queryResult); results.consumeResult(queryResult, () -> {}); - SearchShardTarget shard2Target = new SearchShardTarget("node1", new ShardId("test", "na", 0), null, OriginalIndices.NONE); + SearchShardTarget shard2Target = new SearchShardTarget("node1", new ShardId("test", "na", 0), null); queryResult = new QuerySearchResult(new ShardSearchContextId("", 321), shard2Target, null); queryResult.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(84, 2.0F)}), 2.0F), new DocValueFormat[0]); @@ -414,7 +413,7 @@ public void testCleanupIrrelevantContexts() { // contexts that are not fetched s boolean profiled = randomBoolean(); final ShardSearchContextId ctx1 = new ShardSearchContextId(UUIDs.base64UUID(), 123); - SearchShardTarget shard1Target = new SearchShardTarget("node1", new ShardId("test", "na", 0), null, OriginalIndices.NONE); + SearchShardTarget shard1Target = new SearchShardTarget("node1", new ShardId("test", "na", 0), null); QuerySearchResult queryResult = new QuerySearchResult(ctx1, shard1Target, null); queryResult.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(42, 1.0F)}), 2.0F), new DocValueFormat[0]); @@ -424,7 +423,7 @@ public void testCleanupIrrelevantContexts() { // contexts that are not fetched s results.consumeResult(queryResult, () -> {}); final ShardSearchContextId ctx2 = new ShardSearchContextId(UUIDs.base64UUID(), 321); - SearchShardTarget shard2Target = new SearchShardTarget("node2", new ShardId("test", "na", 1), null, OriginalIndices.NONE); + SearchShardTarget shard2Target = new SearchShardTarget("node2", new ShardId("test", "na", 1), null); queryResult = new QuerySearchResult(ctx2, shard2Target, null); queryResult.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(84, 2.0F)}), 2.0F), new DocValueFormat[0]); diff --git a/server/src/test/java/org/elasticsearch/action/search/MockSearchPhaseContext.java b/server/src/test/java/org/elasticsearch/action/search/MockSearchPhaseContext.java index d579e492f9465..3d65aa72816ee 100644 --- a/server/src/test/java/org/elasticsearch/action/search/MockSearchPhaseContext.java +++ b/server/src/test/java/org/elasticsearch/action/search/MockSearchPhaseContext.java @@ -74,6 +74,11 @@ public SearchRequest getRequest() { return searchRequest; } + @Override + public OriginalIndices getOriginalIndices(String clusterAlias) { + return new OriginalIndices(searchRequest.indices(), searchRequest.indicesOptions()); + } + @Override public void sendSearchResponse(InternalSearchResponse internalSearchResponse, AtomicArray queryResults) { String scrollId = getRequest().scroll() != null ? TransportSearchHelper.buildScrollId(queryResults) : null; diff --git a/server/src/test/java/org/elasticsearch/action/search/QueryPhaseResultConsumerTests.java b/server/src/test/java/org/elasticsearch/action/search/QueryPhaseResultConsumerTests.java index 2e67b17e0c835..318e253586d50 100644 --- a/server/src/test/java/org/elasticsearch/action/search/QueryPhaseResultConsumerTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/QueryPhaseResultConsumerTests.java @@ -11,7 +11,6 @@ import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.TotalHits; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.breaker.CircuitBreaker; import org.elasticsearch.common.breaker.NoopCircuitBreaker; import org.elasticsearch.common.lucene.search.TopDocsAndMaxScore; @@ -95,7 +94,7 @@ public void testProgressListenerExceptionsAreCaught() throws Exception { for (int i = 0; i < 10; i++) { SearchShardTarget searchShardTarget = new SearchShardTarget("node", new ShardId("index", "uuid", i), - null, OriginalIndices.NONE); + null); QuerySearchResult querySearchResult = new QuerySearchResult(); TopDocs topDocs = new TopDocs(new TotalHits(0, TotalHits.Relation.EQUAL_TO), new ScoreDoc[0]); querySearchResult.topDocs(new TopDocsAndMaxScore(topDocs, Float.NaN), new DocValueFormat[0]); diff --git a/server/src/test/java/org/elasticsearch/action/search/SearchPhaseControllerTests.java b/server/src/test/java/org/elasticsearch/action/search/SearchPhaseControllerTests.java index 1c9d40ea7a4d3..e2c430b8bf6ef 100644 --- a/server/src/test/java/org/elasticsearch/action/search/SearchPhaseControllerTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/SearchPhaseControllerTests.java @@ -19,7 +19,6 @@ import org.apache.lucene.search.TotalHits.Relation; import org.apache.lucene.search.grouping.CollapseTopFieldDocs; import org.apache.lucene.util.BytesRef; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.Strings; import org.elasticsearch.common.UUIDs; import org.elasticsearch.common.breaker.CircuitBreaker; @@ -319,7 +318,7 @@ private static AtomicArray generateQueryResults( for (int shardIndex = 0; shardIndex < nShards; shardIndex++) { String clusterAlias = randomBoolean() ? null : "remote"; SearchShardTarget searchShardTarget = new SearchShardTarget("", new ShardId("", "", shardIndex), - clusterAlias, OriginalIndices.NONE); + clusterAlias); QuerySearchResult querySearchResult = new QuerySearchResult(new ShardSearchContextId("", shardIndex), searchShardTarget, null); final TopDocs topDocs; float maxScore = 0; @@ -465,13 +464,13 @@ private void consumerTestCase(int numEmptyResponses) throws Exception { QuerySearchResult empty = QuerySearchResult.nullInstance(); int shardId = 2 + numEmptyResponses; empty.setShardIndex(2+numEmptyResponses); - empty.setSearchShardTarget(new SearchShardTarget("node", new ShardId("a", "b", shardId), null, OriginalIndices.NONE)); + empty.setSearchShardTarget(new SearchShardTarget("node", new ShardId("a", "b", shardId), null)); consumer.consumeResult(empty, latch::countDown); numEmptyResponses --; } QuerySearchResult result = new QuerySearchResult(new ShardSearchContextId("", 0), - new SearchShardTarget("node", new ShardId("a", "b", 0), null, OriginalIndices.NONE), null); + new SearchShardTarget("node", new ShardId("a", "b", 0), null), null); result.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(0, TotalHits.Relation.EQUAL_TO), new ScoreDoc[0]), Float.NaN), new DocValueFormat[0]); InternalAggregations aggs = InternalAggregations.from(singletonList(new InternalMax("test", 1.0D, DocValueFormat.RAW, emptyMap()))); @@ -480,7 +479,7 @@ private void consumerTestCase(int numEmptyResponses) throws Exception { consumer.consumeResult(result, latch::countDown); result = new QuerySearchResult(new ShardSearchContextId("", 1), - new SearchShardTarget("node", new ShardId("a", "b", 0), null, OriginalIndices.NONE), null); + new SearchShardTarget("node", new ShardId("a", "b", 0), null), null); result.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(0, TotalHits.Relation.EQUAL_TO), new ScoreDoc[0]), Float.NaN), new DocValueFormat[0]); aggs = InternalAggregations.from(singletonList(new InternalMax("test", 3.0D, DocValueFormat.RAW, emptyMap()))); @@ -489,7 +488,7 @@ private void consumerTestCase(int numEmptyResponses) throws Exception { consumer.consumeResult(result, latch::countDown); result = new QuerySearchResult(new ShardSearchContextId("", 1), - new SearchShardTarget("node", new ShardId("a", "b", 0), null, OriginalIndices.NONE), null); + new SearchShardTarget("node", new ShardId("a", "b", 0), null), null); result.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(0, TotalHits.Relation.EQUAL_TO), new ScoreDoc[0]), Float.NaN), new DocValueFormat[0]); aggs = InternalAggregations.from(singletonList(new InternalMax("test", 2.0D, DocValueFormat.RAW, emptyMap()))); @@ -501,7 +500,7 @@ private void consumerTestCase(int numEmptyResponses) throws Exception { result = QuerySearchResult.nullInstance(); int shardId = 2 + numEmptyResponses; result.setShardIndex(shardId); - result.setSearchShardTarget(new SearchShardTarget("node", new ShardId("a", "b", shardId), null, OriginalIndices.NONE)); + result.setSearchShardTarget(new SearchShardTarget("node", new ShardId("a", "b", shardId), null)); consumer.consumeResult(result, latch::countDown); numEmptyResponses--; @@ -555,7 +554,7 @@ public void testConsumerConcurrently() throws Exception { int number = randomIntBetween(1, 1000); max.updateAndGet(prev -> Math.max(prev, number)); QuerySearchResult result = new QuerySearchResult(new ShardSearchContextId("", id), - new SearchShardTarget("node", new ShardId("a", "b", id), null, OriginalIndices.NONE), null); + new SearchShardTarget("node", new ShardId("a", "b", id), null), null); result.topDocs(new TopDocsAndMaxScore( new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(0, number)}), number), new DocValueFormat[0]); @@ -603,7 +602,7 @@ public void testConsumerOnlyAggs() throws Exception { int number = randomIntBetween(1, 1000); max.updateAndGet(prev -> Math.max(prev, number)); QuerySearchResult result = new QuerySearchResult(new ShardSearchContextId("", i), - new SearchShardTarget("node", new ShardId("a", "b", i), null, OriginalIndices.NONE), null); + new SearchShardTarget("node", new ShardId("a", "b", i), null), null); result.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[0]), number), new DocValueFormat[0]); InternalAggregations aggs = InternalAggregations.from(Collections.singletonList(new InternalMax("test", (double) number, @@ -645,7 +644,7 @@ public void testConsumerOnlyHits() throws Exception { int number = randomIntBetween(1, 1000); max.updateAndGet(prev -> Math.max(prev, number)); QuerySearchResult result = new QuerySearchResult(new ShardSearchContextId("", i), - new SearchShardTarget("node", new ShardId("a", "b", i), null, OriginalIndices.NONE), null); + new SearchShardTarget("node", new ShardId("a", "b", i), null), null); result.topDocs(new TopDocsAndMaxScore(new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[] {new ScoreDoc(0, number)}), number), new DocValueFormat[0]); result.setShardIndex(i); @@ -687,7 +686,7 @@ public void testReduceTopNWithFromOffset() throws Exception { CountDownLatch latch = new CountDownLatch(4); for (int i = 0; i < 4; i++) { QuerySearchResult result = new QuerySearchResult(new ShardSearchContextId("", i), - new SearchShardTarget("node", new ShardId("a", "b", i), null, OriginalIndices.NONE), null); + new SearchShardTarget("node", new ShardId("a", "b", i), null), null); ScoreDoc[] docs = new ScoreDoc[3]; for (int j = 0; j < docs.length; j++) { docs[j] = new ScoreDoc(0, score--); @@ -732,7 +731,7 @@ public void testConsumerSortByField() throws Exception { FieldDoc[] fieldDocs = {new FieldDoc(0, Float.NaN, new Object[]{number})}; TopDocs topDocs = new TopFieldDocs(new TotalHits(1, Relation.EQUAL_TO), fieldDocs, sortFields); QuerySearchResult result = new QuerySearchResult(new ShardSearchContextId("", i), - new SearchShardTarget("node", new ShardId("a", "b", i), null, OriginalIndices.NONE), null); + new SearchShardTarget("node", new ShardId("a", "b", i), null), null); result.topDocs(new TopDocsAndMaxScore(topDocs, Float.NaN), docValueFormats); result.setShardIndex(i); result.size(size); @@ -773,7 +772,7 @@ public void testConsumerFieldCollapsing() throws Exception { FieldDoc[] fieldDocs = {new FieldDoc(0, Float.NaN, values)}; TopDocs topDocs = new CollapseTopFieldDocs("field", new TotalHits(1, Relation.EQUAL_TO), fieldDocs, sortFields, values); QuerySearchResult result = new QuerySearchResult(new ShardSearchContextId("", i), - new SearchShardTarget("node", new ShardId("a", "b", i), null, OriginalIndices.NONE), null); + new SearchShardTarget("node", new ShardId("a", "b", i), null), null); result.topDocs(new TopDocsAndMaxScore(topDocs, Float.NaN), docValueFormats); result.setShardIndex(i); result.size(size); @@ -809,7 +808,7 @@ public void testConsumerSuggestions() throws Exception { CountDownLatch latch = new CountDownLatch(expectedNumResults); for (int i = 0; i < expectedNumResults; i++) { QuerySearchResult result = new QuerySearchResult(new ShardSearchContextId("", i), - new SearchShardTarget("node", new ShardId("a", "b", i), null, OriginalIndices.NONE), null); + new SearchShardTarget("node", new ShardId("a", "b", i), null), null); List>> suggestions = new ArrayList<>(); { @@ -938,7 +937,7 @@ public void onFinalReduce(List shards, TotalHits totalHits, Interna int number = randomIntBetween(1, 1000); max.updateAndGet(prev -> Math.max(prev, number)); QuerySearchResult result = new QuerySearchResult(new ShardSearchContextId("", id), - new SearchShardTarget("node", new ShardId("a", "b", id), null, OriginalIndices.NONE), null); + new SearchShardTarget("node", new ShardId("a", "b", id), null), null); result.topDocs(new TopDocsAndMaxScore( new TopDocs(new TotalHits(1, TotalHits.Relation.EQUAL_TO), new ScoreDoc[]{new ScoreDoc(0, number)}), number), new DocValueFormat[0]); @@ -1004,7 +1003,7 @@ private void testReduceCase(int numShards, int bufferSize, boolean shouldFail) t final int index = i; threads[index] = new Thread(() -> { QuerySearchResult result = new QuerySearchResult(new ShardSearchContextId(UUIDs.randomBase64UUID(), index), - new SearchShardTarget("node", new ShardId("a", "b", index), null, OriginalIndices.NONE), + new SearchShardTarget("node", new ShardId("a", "b", index), null), null); result.topDocs(new TopDocsAndMaxScore( new TopDocs(new TotalHits(0, TotalHits.Relation.EQUAL_TO), Lucene.EMPTY_SCORE_DOCS), Float.NaN), @@ -1054,7 +1053,7 @@ public void testFailConsumeAggs() throws Exception { for (int i = 0; i < expectedNumResults; i++) { final int index = i; QuerySearchResult result = new QuerySearchResult(new ShardSearchContextId(UUIDs.randomBase64UUID(), index), - new SearchShardTarget("node", new ShardId("a", "b", index), null, OriginalIndices.NONE), + new SearchShardTarget("node", new ShardId("a", "b", index), null), null); result.topDocs(new TopDocsAndMaxScore( new TopDocs(new TotalHits(0, TotalHits.Relation.EQUAL_TO), Lucene.EMPTY_SCORE_DOCS), Float.NaN), diff --git a/server/src/test/java/org/elasticsearch/action/search/SearchPhaseExecutionExceptionTests.java b/server/src/test/java/org/elasticsearch/action/search/SearchPhaseExecutionExceptionTests.java index f01aa4b862ce7..5b3edddbb748d 100644 --- a/server/src/test/java/org/elasticsearch/action/search/SearchPhaseExecutionExceptionTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/SearchPhaseExecutionExceptionTests.java @@ -9,7 +9,6 @@ package org.elasticsearch.action.search; import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.TimestampParsingException; import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.Strings; @@ -38,11 +37,11 @@ public void testToXContent() throws IOException { SearchPhaseExecutionException exception = new SearchPhaseExecutionException("test", "all shards failed", new ShardSearchFailure[]{ new ShardSearchFailure(new ParsingException(1, 2, "foobar", null), - new SearchShardTarget("node_1", new ShardId("foo", "_na_", 0), null, OriginalIndices.NONE)), + new SearchShardTarget("node_1", new ShardId("foo", "_na_", 0), null)), new ShardSearchFailure(new IndexShardClosedException(new ShardId("foo", "_na_", 1)), - new SearchShardTarget("node_2", new ShardId("foo", "_na_", 1), null, OriginalIndices.NONE)), + new SearchShardTarget("node_2", new ShardId("foo", "_na_", 1), null)), new ShardSearchFailure(new ParsingException(5, 7, "foobar", null), - new SearchShardTarget("node_3", new ShardId("foo", "_na_", 2), null, OriginalIndices.NONE)), + new SearchShardTarget("node_3", new ShardId("foo", "_na_", 2), null)), }); // Failures are grouped (by default) @@ -94,7 +93,7 @@ public void testToAndFromXContent() throws IOException { new NullPointerException() ); shardSearchFailures[i] = new ShardSearchFailure(cause, new SearchShardTarget("node_" + i, - new ShardId("test", "_na_", i), null, OriginalIndices.NONE)); + new ShardId("test", "_na_", i), null)); } final String phase = randomFrom("query", "search", "other"); @@ -143,7 +142,7 @@ public void testPhaseFailureWithSearchShardFailure() { new InvalidIndexTemplateException("foo", "bar") ); shardSearchFailures[i] = new ShardSearchFailure(cause, new SearchShardTarget("node_" + i, - new ShardId("test", "_na_", i), null, OriginalIndices.NONE)); + new ShardId("test", "_na_", i), null)); } final String phase = randomFrom("fetch", "search", "other"); diff --git a/server/src/test/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncActionTests.java b/server/src/test/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncActionTests.java index 870a60150db7d..9cbb54ab44160 100644 --- a/server/src/test/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncActionTests.java @@ -100,7 +100,7 @@ public void sendExecuteQuery(Transport.Connection connection, ShardSearchRequest numWithTopDocs.incrementAndGet(); } QuerySearchResult queryResult = new QuerySearchResult(new ShardSearchContextId("N/A", 123), - new SearchShardTarget("node1", new ShardId("idx", "na", shardId), null, OriginalIndices.NONE), null); + new SearchShardTarget("node1", new ShardId("idx", "na", shardId), null), null); SortField sortField = new SortField("timestamp", SortField.Type.LONG); if (withCollapse) { queryResult.topDocs(new TopDocsAndMaxScore( @@ -311,7 +311,7 @@ public void sendExecuteQuery(Transport.Connection connection, ShardSearchRequest SearchTask task, SearchActionListener listener) { int shardId = request.shardId().id(); QuerySearchResult queryResult = new QuerySearchResult(new ShardSearchContextId("N/A", 123), - new SearchShardTarget("node1", new ShardId("idx", "na", shardId), null, OriginalIndices.NONE), null); + new SearchShardTarget("node1", new ShardId("idx", "na", shardId), null), null); SortField sortField = new SortField("timestamp", SortField.Type.LONG); if (shardId == 0) { queryResult.topDocs(new TopDocsAndMaxScore(new TopFieldDocs( @@ -409,7 +409,7 @@ public void sendExecuteQuery(Transport.Connection connection, ShardSearchRequest SearchTask task, SearchActionListener listener) { int shardId = request.shardId().id(); QuerySearchResult queryResult = new QuerySearchResult(new ShardSearchContextId("N/A", 123), - new SearchShardTarget("node1", new ShardId("idx", "na", shardId), null, OriginalIndices.NONE), null); + new SearchShardTarget("node1", new ShardId("idx", "na", shardId), null), null); SortField sortField = new SortField("timestamp", SortField.Type.LONG); if (shardId == 0) { queryResult.topDocs(new TopDocsAndMaxScore(new TopFieldDocs( @@ -467,7 +467,7 @@ public void run() { assertThat(phase.totalHits.value, equalTo(2L)); assertThat(phase.totalHits.relation, equalTo(TotalHits.Relation.GREATER_THAN_OR_EQUAL_TO)); - SearchShardTarget searchShardTarget = new SearchShardTarget("node3", shardIt.shardId(), null, OriginalIndices.NONE); + SearchShardTarget searchShardTarget = new SearchShardTarget("node3", shardIt.shardId(), null); SearchActionListener listener = new SearchActionListener(searchShardTarget, 0) { @Override public void onFailure(Exception e) { } diff --git a/server/src/test/java/org/elasticsearch/action/search/SearchResponseMergerTests.java b/server/src/test/java/org/elasticsearch/action/search/SearchResponseMergerTests.java index b6d9e40878f77..7663525372847 100644 --- a/server/src/test/java/org/elasticsearch/action/search/SearchResponseMergerTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/SearchResponseMergerTests.java @@ -11,7 +11,6 @@ import org.apache.lucene.search.SortField; import org.apache.lucene.search.TotalHits; import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.search.TransportSearchAction.SearchTimeProvider; import org.elasticsearch.common.text.Text; import org.elasticsearch.core.Tuple; @@ -121,7 +120,7 @@ public void testMergeShardFailures() throws InterruptedException { ShardSearchFailure[] shardSearchFailures = new ShardSearchFailure[numFailures]; for (int j = 0; j < numFailures; j++) { ShardId shardId = new ShardId(randomFrom(indices), j); - SearchShardTarget searchShardTarget = new SearchShardTarget(randomAlphaOfLength(6), shardId, clusterAlias, null); + SearchShardTarget searchShardTarget = new SearchShardTarget(randomAlphaOfLength(6), shardId, clusterAlias); ShardSearchFailure failure = new ShardSearchFailure(new IllegalArgumentException(), searchShardTarget); shardSearchFailures[j] = failure; priorityQueue.add(Tuple.tuple(searchShardTarget, failure)); @@ -252,7 +251,7 @@ public void testMergeCompletionSuggestions() throws InterruptedException { ShardId shardId = new ShardId(randomAlphaOfLengthBetween(5, 10), randomAlphaOfLength(10), randomIntBetween(0, Integer.MAX_VALUE)); String clusterAlias = randomBoolean() ? "" : randomAlphaOfLengthBetween(5, 10); - hit.shard(new SearchShardTarget("node", shardId, clusterAlias, OriginalIndices.NONE)); + hit.shard(new SearchShardTarget("node", shardId, clusterAlias)); option.setHit(hit); options.addOption(option); completionSuggestion.addTerm(options); @@ -300,7 +299,7 @@ public void testMergeCompletionSuggestionsTieBreak() throws InterruptedExceptio Collections.emptyMap()); SearchHit searchHit = new SearchHit(docId); searchHit.shard(new SearchShardTarget("node", new ShardId("index", "uuid", randomIntBetween(0, Integer.MAX_VALUE)), - randomBoolean() ? RemoteClusterService.LOCAL_CLUSTER_GROUP_KEY : randomAlphaOfLengthBetween(5, 10), OriginalIndices.NONE)); + randomBoolean() ? RemoteClusterService.LOCAL_CLUSTER_GROUP_KEY : randomAlphaOfLengthBetween(5, 10))); option.setHit(searchHit); options.addOption(option); completionSuggestion.addTerm(options); @@ -664,7 +663,7 @@ private static SearchHit[] randomSearchHitArray(int numDocs, int numResponses, S for (int j = 0; j < numDocs; j++) { ShardId shardId = new ShardId(randomFrom(indices), randomIntBetween(0, 10)); SearchShardTarget shardTarget = new SearchShardTarget(randomAlphaOfLengthBetween(3, 8), shardId, - clusterAlias, OriginalIndices.NONE); + clusterAlias); SearchHit hit = new SearchHit(randomIntBetween(0, Integer.MAX_VALUE)); float score = Float.NaN; diff --git a/server/src/test/java/org/elasticsearch/action/search/SearchScrollAsyncActionTests.java b/server/src/test/java/org/elasticsearch/action/search/SearchScrollAsyncActionTests.java index dc76e9d23a0e4..1fe511521f8c9 100644 --- a/server/src/test/java/org/elasticsearch/action/search/SearchScrollAsyncActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/SearchScrollAsyncActionTests.java @@ -9,7 +9,6 @@ import org.elasticsearch.Version; import org.elasticsearch.action.ActionListener; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodes; import org.elasticsearch.common.UUIDs; @@ -66,7 +65,7 @@ protected void executeInitialPhase(Transport.Connection connection, InternalScro SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult = new SearchAsyncActionTests.TestSearchPhaseResult(internalRequest.contextId(), connection.getNode()); testSearchPhaseResult.setSearchShardTarget(new SearchShardTarget(connection.getNode().getId(), - new ShardId("test", "_na_", 1), null, OriginalIndices.NONE)); + new ShardId("test", "_na_", 1), null)); searchActionListener.onResponse(testSearchPhaseResult); }).start(); } @@ -157,7 +156,7 @@ protected void executeInitialPhase(Transport.Connection connection, InternalScro SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult = new SearchAsyncActionTests.TestSearchPhaseResult(internalRequest.contextId(), connection.getNode()); testSearchPhaseResult.setSearchShardTarget(new SearchShardTarget(connection.getNode().getId(), - new ShardId("test", "_na_", 1), null, OriginalIndices.NONE)); + new ShardId("test", "_na_", 1), null)); searchActionListener.onResponse(testSearchPhaseResult); }).start(); } @@ -230,7 +229,7 @@ protected void executeInitialPhase(Transport.Connection connection, InternalScro SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult = new SearchAsyncActionTests.TestSearchPhaseResult(internalRequest.contextId(), connection.getNode()); testSearchPhaseResult.setSearchShardTarget(new SearchShardTarget(connection.getNode().getId(), - new ShardId("test", "_na_", 1), null, OriginalIndices.NONE)); + new ShardId("test", "_na_", 1), null)); searchActionListener.onResponse(testSearchPhaseResult); }).start(); } @@ -308,7 +307,7 @@ protected void executeInitialPhase(Transport.Connection connection, InternalScro SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult = new SearchAsyncActionTests.TestSearchPhaseResult(internalRequest.contextId(), connection.getNode()); testSearchPhaseResult.setSearchShardTarget(new SearchShardTarget(connection.getNode().getId(), - new ShardId("test", "_na_", 1), null, OriginalIndices.NONE)); + new ShardId("test", "_na_", 1), null)); searchActionListener.onResponse(testSearchPhaseResult); } }).start(); diff --git a/server/src/test/java/org/elasticsearch/action/search/SearchShardIteratorTests.java b/server/src/test/java/org/elasticsearch/action/search/SearchShardIteratorTests.java index fb3143c089e4b..f30eb0744f6ee 100644 --- a/server/src/test/java/org/elasticsearch/action/search/SearchShardIteratorTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/SearchShardIteratorTests.java @@ -64,7 +64,6 @@ public void testNewSearchShardTarget() { assertEquals(clusterAlias, searchShardTarget.getClusterAlias()); assertSame(shardId, searchShardTarget.getShardId()); assertEquals(nodeId, searchShardTarget.getNodeId()); - assertSame(originalIndices, searchShardTarget.getOriginalIndices()); } public void testEqualsAndHashcode() { diff --git a/server/src/test/java/org/elasticsearch/action/search/ShardSearchFailureTests.java b/server/src/test/java/org/elasticsearch/action/search/ShardSearchFailureTests.java index 862a57fbbb575..e8a005ba87ad3 100644 --- a/server/src/test/java/org/elasticsearch/action/search/ShardSearchFailureTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/ShardSearchFailureTests.java @@ -8,7 +8,6 @@ package org.elasticsearch.action.search; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.bytes.BytesReference; @@ -37,7 +36,7 @@ public static ShardSearchFailure createTestItem(String indexUuid) { String indexName = randomAlphaOfLengthBetween(5, 10); String clusterAlias = randomBoolean() ? randomAlphaOfLengthBetween(5, 10) : null; searchShardTarget = new SearchShardTarget(nodeId, - new ShardId(new Index(indexName, indexUuid), randomInt()), clusterAlias, OriginalIndices.NONE); + new ShardId(new Index(indexName, indexUuid), randomInt()), clusterAlias); } return new ShardSearchFailure(ex, searchShardTarget); } @@ -91,7 +90,7 @@ private void doFromXContentTestWithRandomFields(boolean addRandomFields) throws public void testToXContent() throws IOException { ShardSearchFailure failure = new ShardSearchFailure(new ParsingException(0, 0, "some message", null), - new SearchShardTarget("nodeId", new ShardId(new Index("indexName", "indexUuid"), 123), null, OriginalIndices.NONE)); + new SearchShardTarget("nodeId", new ShardId(new Index("indexName", "indexUuid"), 123), null)); BytesReference xContent = toXContent(failure, XContentType.JSON, randomBoolean()); assertEquals( "{\"shard\":123," @@ -109,7 +108,7 @@ public void testToXContent() throws IOException { public void testToXContentWithClusterAlias() throws IOException { ShardSearchFailure failure = new ShardSearchFailure(new ParsingException(0, 0, "some message", null), - new SearchShardTarget("nodeId", new ShardId(new Index("indexName", "indexUuid"), 123), "cluster1", OriginalIndices.NONE)); + new SearchShardTarget("nodeId", new ShardId(new Index("indexName", "indexUuid"), 123), "cluster1")); BytesReference xContent = toXContent(failure, XContentType.JSON, randomBoolean()); assertEquals( "{\"shard\":123," diff --git a/server/src/test/java/org/elasticsearch/action/search/TransportSearchHelperTests.java b/server/src/test/java/org/elasticsearch/action/search/TransportSearchHelperTests.java index 432b9af280804..4fb6866f04b0c 100644 --- a/server/src/test/java/org/elasticsearch/action/search/TransportSearchHelperTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/TransportSearchHelperTests.java @@ -27,13 +27,13 @@ public static AtomicArray generateQueryResults() { DiscoveryNode node3 = new DiscoveryNode("node_3", buildNewFakeTransportAddress(), Version.CURRENT); SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult1 = new SearchAsyncActionTests.TestSearchPhaseResult(new ShardSearchContextId("a", 1), node1); - testSearchPhaseResult1.setSearchShardTarget(new SearchShardTarget("node_1", new ShardId("idx", "uuid1", 2), "cluster_x", null)); + testSearchPhaseResult1.setSearchShardTarget(new SearchShardTarget("node_1", new ShardId("idx", "uuid1", 2), "cluster_x")); SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult2 = new SearchAsyncActionTests.TestSearchPhaseResult(new ShardSearchContextId("b", 12), node2); - testSearchPhaseResult2.setSearchShardTarget(new SearchShardTarget("node_2", new ShardId("idy", "uuid2", 42), "cluster_y", null)); + testSearchPhaseResult2.setSearchShardTarget(new SearchShardTarget("node_2", new ShardId("idy", "uuid2", 42), "cluster_y")); SearchAsyncActionTests.TestSearchPhaseResult testSearchPhaseResult3 = new SearchAsyncActionTests.TestSearchPhaseResult(new ShardSearchContextId("c", 42), node3); - testSearchPhaseResult3.setSearchShardTarget(new SearchShardTarget("node_3", new ShardId("idy", "uuid2", 43), null, null)); + testSearchPhaseResult3.setSearchShardTarget(new SearchShardTarget("node_3", new ShardId("idy", "uuid2", 43), null)); array.setOnce(0, testSearchPhaseResult1); array.setOnce(1, testSearchPhaseResult2); array.setOnce(2, testSearchPhaseResult3); diff --git a/server/src/test/java/org/elasticsearch/rest/BytesRestResponseTests.java b/server/src/test/java/org/elasticsearch/rest/BytesRestResponseTests.java index 344b3367415f7..777fd4abe7b09 100644 --- a/server/src/test/java/org/elasticsearch/rest/BytesRestResponseTests.java +++ b/server/src/test/java/org/elasticsearch/rest/BytesRestResponseTests.java @@ -13,7 +13,6 @@ import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.ResourceAlreadyExistsException; import org.elasticsearch.ResourceNotFoundException; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.search.SearchPhaseExecutionException; import org.elasticsearch.action.search.ShardSearchFailure; import org.elasticsearch.common.ParsingException; @@ -139,9 +138,9 @@ public void testConvert() throws IOException { RestRequest request = new FakeRestRequest(); RestChannel channel = new DetailedExceptionRestChannel(request); ShardSearchFailure failure = new ShardSearchFailure(new ParsingException(1, 2, "foobar", null), - new SearchShardTarget("node_1", new ShardId("foo", "_na_", 1), null, OriginalIndices.NONE)); + new SearchShardTarget("node_1", new ShardId("foo", "_na_", 1), null)); ShardSearchFailure failure1 = new ShardSearchFailure(new ParsingException(1, 2, "foobar", null), - new SearchShardTarget("node_1", new ShardId("foo", "_na_", 2), null, OriginalIndices.NONE)); + new SearchShardTarget("node_1", new ShardId("foo", "_na_", 2), null)); SearchPhaseExecutionException ex = new SearchPhaseExecutionException("search", "all shards failed", new ShardSearchFailure[] {failure, failure1}); BytesRestResponse response = new BytesRestResponse(channel, new RemoteTransportException("foo", ex)); diff --git a/server/src/test/java/org/elasticsearch/rest/action/RestActionsTests.java b/server/src/test/java/org/elasticsearch/rest/action/RestActionsTests.java index ff3eb65784b7c..59fcca4f6a233 100644 --- a/server/src/test/java/org/elasticsearch/rest/action/RestActionsTests.java +++ b/server/src/test/java/org/elasticsearch/rest/action/RestActionsTests.java @@ -9,7 +9,6 @@ package org.elasticsearch.rest.action; import com.fasterxml.jackson.core.io.JsonEOFException; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.ShardOperationFailedException; import org.elasticsearch.action.search.ShardSearchFailure; import org.elasticsearch.cluster.metadata.IndexMetadata; @@ -188,7 +187,7 @@ private static ShardSearchFailure createShardFailureParsingException(String node private static SearchShardTarget createSearchShardTarget(String nodeId, int shardId, String index, String clusterAlias) { return new SearchShardTarget(nodeId, - new ShardId(new Index(index, IndexMetadata.INDEX_UUID_NA_VALUE), shardId), clusterAlias, OriginalIndices.NONE); + new ShardId(new Index(index, IndexMetadata.INDEX_UUID_NA_VALUE), shardId), clusterAlias); } @Override diff --git a/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java b/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java index b5e0bc90cf8bc..332bffb8dec49 100644 --- a/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java +++ b/server/src/test/java/org/elasticsearch/search/DefaultSearchContextTests.java @@ -17,7 +17,6 @@ import org.apache.lucene.search.Sort; import org.apache.lucene.store.Directory; import org.elasticsearch.Version; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.common.UUIDs; @@ -128,7 +127,7 @@ protected Engine.Searcher acquireSearcherInternal(String source) { } }; - SearchShardTarget target = new SearchShardTarget("node", shardId, null, OriginalIndices.NONE); + SearchShardTarget target = new SearchShardTarget("node", shardId, null); ReaderContext readerWithoutScroll = new ReaderContext( newContextId(), indexService, indexShard, searcherSupplier.get(), randomNonNegativeLong(), false); @@ -266,7 +265,7 @@ protected Engine.Searcher acquireSearcherInternal(String source) { } } }; - SearchShardTarget target = new SearchShardTarget("node", shardId, null, OriginalIndices.NONE); + SearchShardTarget target = new SearchShardTarget("node", shardId, null); ReaderContext readerContext = new ReaderContext( newContextId(), indexService, indexShard, searcherSupplier, randomNonNegativeLong(), false); DefaultSearchContext context = new DefaultSearchContext(readerContext, shardSearchRequest, target, null, diff --git a/server/src/test/java/org/elasticsearch/search/SearchHitTests.java b/server/src/test/java/org/elasticsearch/search/SearchHitTests.java index c4de8093bbc2b..972b9f64cb3d2 100644 --- a/server/src/test/java/org/elasticsearch/search/SearchHitTests.java +++ b/server/src/test/java/org/elasticsearch/search/SearchHitTests.java @@ -11,7 +11,6 @@ import org.apache.lucene.search.Explanation; import org.apache.lucene.search.TotalHits; import org.elasticsearch.Version; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; @@ -129,7 +128,7 @@ public static SearchHit createTestItem(XContentType xContentType, boolean withOp String index = randomAlphaOfLengthBetween(5, 10); String clusterAlias = randomBoolean() ? null : randomAlphaOfLengthBetween(5, 10); hit.shard(new SearchShardTarget(randomAlphaOfLengthBetween(5, 10), - new ShardId(new Index(index, randomAlphaOfLengthBetween(5, 10)), randomInt()), clusterAlias, OriginalIndices.NONE)); + new ShardId(new Index(index, randomAlphaOfLengthBetween(5, 10)), randomInt()), clusterAlias)); } return hit; } @@ -215,7 +214,7 @@ public void testToXContent() throws IOException { public void testSerializeShardTarget() throws Exception { String clusterAlias = randomBoolean() ? null : "cluster_alias"; SearchShardTarget target = new SearchShardTarget("_node_id", new ShardId(new Index("_index", "_na_"), 0), - clusterAlias, OriginalIndices.NONE); + clusterAlias); Map innerHits = new HashMap<>(); SearchHit innerHit1 = new SearchHit(0, "_id", null, null); diff --git a/server/src/test/java/org/elasticsearch/search/SearchHitsTests.java b/server/src/test/java/org/elasticsearch/search/SearchHitsTests.java index 85f13c98b8b9e..8a9c89f36803a 100644 --- a/server/src/test/java/org/elasticsearch/search/SearchHitsTests.java +++ b/server/src/test/java/org/elasticsearch/search/SearchHitsTests.java @@ -11,7 +11,6 @@ import org.apache.lucene.search.SortField; import org.apache.lucene.search.TotalHits; import org.apache.lucene.util.TestUtil; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.Writeable; @@ -219,7 +218,7 @@ public void testFromXContentWithShards() throws IOException { String index = randomAlphaOfLengthBetween(5, 10); String clusterAlias = randomBoolean() ? null : randomAlphaOfLengthBetween(5, 10); final SearchShardTarget shardTarget = new SearchShardTarget(randomAlphaOfLengthBetween(5, 10), - new ShardId(new Index(index, randomAlphaOfLengthBetween(5, 10)), randomInt()), clusterAlias, OriginalIndices.NONE); + new ShardId(new Index(index, randomAlphaOfLengthBetween(5, 10)), randomInt()), clusterAlias); if (withExplanation) { hit.explanation(SearchHitTests.createExplanation(randomIntBetween(0, 5))); } diff --git a/server/src/test/java/org/elasticsearch/search/profile/SearchProfileResultsBuilderTests.java b/server/src/test/java/org/elasticsearch/search/profile/SearchProfileResultsBuilderTests.java index 6bce43afaa573..f279d867a3e86 100644 --- a/server/src/test/java/org/elasticsearch/search/profile/SearchProfileResultsBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/profile/SearchProfileResultsBuilderTests.java @@ -89,6 +89,6 @@ private static FetchSearchResult fetchResult(SearchShardTarget target, ProfileRe } private static SearchShardTarget randomTarget() { - return new SearchShardTarget(randomAlphaOfLength(5), new ShardId(randomAlphaOfLength(5), "uuid", randomInt(6)), null, null); + return new SearchShardTarget(randomAlphaOfLength(5), new ShardId(randomAlphaOfLength(5), "uuid", randomInt(6)), null); } } diff --git a/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java b/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java index bf645d137cda9..19c55bc7465ed 100644 --- a/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java +++ b/server/src/test/java/org/elasticsearch/search/query/QuerySearchResultTests.java @@ -12,7 +12,6 @@ import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.TotalHits; import org.elasticsearch.Version; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.OriginalIndicesTests; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.common.Strings; @@ -49,7 +48,7 @@ private static QuerySearchResult createTestInstance() throws Exception { ShardSearchRequest shardSearchRequest = new ShardSearchRequest(OriginalIndicesTests.randomOriginalIndices(), searchRequest, shardId, 0, 1, new AliasFilter(null, Strings.EMPTY_ARRAY), 1.0f, randomNonNegativeLong(), null); QuerySearchResult result = new QuerySearchResult(new ShardSearchContextId(UUIDs.base64UUID(), randomLong()), - new SearchShardTarget("node", shardId, null, OriginalIndices.NONE), shardSearchRequest); + new SearchShardTarget("node", shardId, null), shardSearchRequest); if (randomBoolean()) { result.terminatedEarly(randomBoolean()); } diff --git a/test/framework/src/main/java/org/elasticsearch/test/TestSearchContext.java b/test/framework/src/main/java/org/elasticsearch/test/TestSearchContext.java index 06202619592fb..236e2032b177e 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/TestSearchContext.java +++ b/test/framework/src/main/java/org/elasticsearch/test/TestSearchContext.java @@ -10,7 +10,6 @@ import org.apache.lucene.search.Collector; import org.apache.lucene.search.FieldDoc; import org.apache.lucene.search.Query; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.search.SearchShardTask; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.core.TimeValue; @@ -55,7 +54,7 @@ public class TestSearchContext extends SearchContext { public static final SearchShardTarget SHARD_TARGET = - new SearchShardTarget("test", new ShardId("test", "test", 0), null, OriginalIndices.NONE); + new SearchShardTarget("test", new ShardId("test", "test", 0), null); final IndexService indexService; final BitsetFilterCache fixedBitSetFilterCache; diff --git a/x-pack/plugin/async-search/src/test/java/org/elasticsearch/xpack/search/AsyncSearchTaskTests.java b/x-pack/plugin/async-search/src/test/java/org/elasticsearch/xpack/search/AsyncSearchTaskTests.java index 3ee38242eef98..f32688feaa5f5 100644 --- a/x-pack/plugin/async-search/src/test/java/org/elasticsearch/xpack/search/AsyncSearchTaskTests.java +++ b/x-pack/plugin/async-search/src/test/java/org/elasticsearch/xpack/search/AsyncSearchTaskTests.java @@ -9,7 +9,6 @@ import org.apache.lucene.search.TotalHits; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.ActionListener; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.search.SearchPhaseExecutionException; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; @@ -246,7 +245,7 @@ public void testWithFetchFailures() throws InterruptedException { IOException failure = new IOException("boum"); //fetch failures are currently ignored, they come back with onFailure or onResponse anyways task.getSearchProgressActionListener().onFetchFailure(i, - new SearchShardTarget("0", new ShardId("0", "0", 1), null, OriginalIndices.NONE), + new SearchShardTarget("0", new ShardId("0", "0", 1), null), failure); shardSearchFailures[i] = new ShardSearchFailure(failure); } @@ -280,7 +279,7 @@ public void testFatalFailureDuringFetch() throws InterruptedException { for (int i = 0; i < numShards; i++) { //fetch failures are currently ignored, they come back with onFailure or onResponse anyways task.getSearchProgressActionListener().onFetchFailure(i, - new SearchShardTarget("0", new ShardId("0", "0", 1), null, OriginalIndices.NONE), + new SearchShardTarget("0", new ShardId("0", "0", 1), null), new IOException("boum")); } assertCompletionListeners(task, totalShards, totalShards, numSkippedShards, 0, true, false); diff --git a/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/persistence/SeqNoPrimaryTermAndIndexTests.java b/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/persistence/SeqNoPrimaryTermAndIndexTests.java index 2b7b9c5b84214..852065b87be90 100644 --- a/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/persistence/SeqNoPrimaryTermAndIndexTests.java +++ b/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/persistence/SeqNoPrimaryTermAndIndexTests.java @@ -35,7 +35,7 @@ public void testFromSearchHit() { String index = randomAlphaOfLength(10); searchHit.setSeqNo(seqNo); searchHit.setPrimaryTerm(primaryTerm); - searchHit.shard(new SearchShardTarget("anynode", new ShardId(index, randomAlphaOfLength(10), 1), null, null)); + searchHit.shard(new SearchShardTarget("anynode", new ShardId(index, randomAlphaOfLength(10), 1), null)); assertThat(SeqNoPrimaryTermAndIndex.fromSearchHit(searchHit), equalTo(new SeqNoPrimaryTermAndIndex(seqNo, primaryTerm, index))); } diff --git a/x-pack/plugin/watcher/src/internalClusterTest/java/org/elasticsearch/xpack/watcher/condition/CompareConditionSearchTests.java b/x-pack/plugin/watcher/src/internalClusterTest/java/org/elasticsearch/xpack/watcher/condition/CompareConditionSearchTests.java index c4b1055cf8404..dca950c8c4922 100644 --- a/x-pack/plugin/watcher/src/internalClusterTest/java/org/elasticsearch/xpack/watcher/condition/CompareConditionSearchTests.java +++ b/x-pack/plugin/watcher/src/internalClusterTest/java/org/elasticsearch/xpack/watcher/condition/CompareConditionSearchTests.java @@ -7,7 +7,6 @@ package org.elasticsearch.xpack.watcher.condition; import org.apache.lucene.search.TotalHits; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.ShardSearchFailure; import org.elasticsearch.common.xcontent.ToXContent; @@ -78,7 +77,7 @@ public void testExecuteAccessHits() throws Exception { Clock.systemUTC()); SearchHit hit = new SearchHit(0, "1", null, null); hit.score(1f); - hit.shard(new SearchShardTarget("a", new ShardId("a", "indexUUID", 0), null, OriginalIndices.NONE)); + hit.shard(new SearchShardTarget("a", new ShardId("a", "indexUUID", 0), null)); InternalSearchResponse internalSearchResponse = new InternalSearchResponse( new SearchHits(new SearchHit[]{hit}, new TotalHits(1L, TotalHits.Relation.EQUAL_TO), 1f), diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/WatcherServiceTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/WatcherServiceTests.java index 82b1e86b709ce..8fd20f0e10424 100644 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/WatcherServiceTests.java +++ b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/WatcherServiceTests.java @@ -9,7 +9,6 @@ import org.apache.lucene.search.TotalHits; import org.elasticsearch.Version; import org.elasticsearch.action.ActionListener; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.admin.indices.refresh.RefreshAction; import org.elasticsearch.action.admin.indices.refresh.RefreshRequest; import org.elasticsearch.action.admin.indices.refresh.RefreshResponse; @@ -181,7 +180,7 @@ void stopExecutor() { String id = String.valueOf(i); SearchHit hit = new SearchHit(1, id, Collections.emptyMap(), Collections.emptyMap()); hit.version(1L); - hit.shard(new SearchShardTarget("nodeId", new ShardId(watchIndex, 0), "whatever", OriginalIndices.NONE)); + hit.shard(new SearchShardTarget("nodeId", new ShardId(watchIndex, 0), "whatever")); hits[i] = hit; boolean active = randomBoolean(); diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/execution/TriggeredWatchStoreTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/execution/TriggeredWatchStoreTests.java index eba88240091d0..78513084fcb6d 100644 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/execution/TriggeredWatchStoreTests.java +++ b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/execution/TriggeredWatchStoreTests.java @@ -11,7 +11,6 @@ import org.elasticsearch.Version; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.DocWriteRequest; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.admin.indices.refresh.RefreshAction; import org.elasticsearch.action.admin.indices.refresh.RefreshResponse; import org.elasticsearch.action.bulk.BulkAction; @@ -218,7 +217,7 @@ public void testFindTriggeredWatchesGoodCase() { BytesArray source = new BytesArray("{}"); SearchHit hit = new SearchHit(0, "first_foo", null, null); hit.version(1L); - hit.shard(new SearchShardTarget("_node_id", new ShardId(index, 0), null, OriginalIndices.NONE)); + hit.shard(new SearchShardTarget("_node_id", new ShardId(index, 0), null)); hit.sourceRef(source); SearchHits hits = new SearchHits(new SearchHit[]{hit}, new TotalHits(1, TotalHits.Relation.EQUAL_TO), 1.0f); when(searchResponse1.getHits()).thenReturn(hits); @@ -233,7 +232,7 @@ public void testFindTriggeredWatchesGoodCase() { // First return a scroll response with a single hit and then with no hits hit = new SearchHit(0, "second_foo", null, null); hit.version(1L); - hit.shard(new SearchShardTarget("_node_id", new ShardId(index, 0), null, OriginalIndices.NONE)); + hit.shard(new SearchShardTarget("_node_id", new ShardId(index, 0), null)); hit.sourceRef(source); hits = new SearchHits(new SearchHit[]{hit}, new TotalHits(1, TotalHits.Relation.EQUAL_TO), 1.0f); SearchResponse searchResponse2 = new SearchResponse( From 4ccf9a139d7909c1334583681f9866771b54abf7 Mon Sep 17 00:00:00 2001 From: jimczi Date: Thu, 30 Sep 2021 12:49:10 +0200 Subject: [PATCH 02/18] checkstyle --- .../java/org/elasticsearch/ElasticsearchExceptionTests.java | 3 ++- .../org/elasticsearch/action/search/CountedCollectorTests.java | 1 - .../org/elasticsearch/action/search/DfsQueryPhaseTests.java | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/ElasticsearchExceptionTests.java b/server/src/test/java/org/elasticsearch/ElasticsearchExceptionTests.java index 767cdd10ba75f..2966a6c792910 100644 --- a/server/src/test/java/org/elasticsearch/ElasticsearchExceptionTests.java +++ b/server/src/test/java/org/elasticsearch/ElasticsearchExceptionTests.java @@ -808,7 +808,8 @@ public void testFailureToAndFromXContentWithDetails() throws IOException { new SearchShardTarget("node_g", new ShardId(new Index("_index_g", "_uuid_g"), 61), null)), new ShardSearchFailure(new RepositoryException("repository_g", "Repo"), new SearchShardTarget("node_g", new ShardId(new Index("_index_g", "_uuid_g"), 62), null)), - new ShardSearchFailure(new SearchContextMissingException(new ShardSearchContextId(UUIDs.randomBase64UUID(), 0L)), null) + new ShardSearchFailure(new SearchContextMissingException(new ShardSearchContextId( + UUIDs.randomBase64UUID(), 0L)), null) }; failure = new SearchPhaseExecutionException("phase_g", "G", failureCause, shardFailures); diff --git a/server/src/test/java/org/elasticsearch/action/search/CountedCollectorTests.java b/server/src/test/java/org/elasticsearch/action/search/CountedCollectorTests.java index 02b54751a7bd9..ed010c5c146de 100644 --- a/server/src/test/java/org/elasticsearch/action/search/CountedCollectorTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/CountedCollectorTests.java @@ -7,7 +7,6 @@ */ package org.elasticsearch.action.search; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.UUIDs; import org.elasticsearch.common.util.concurrent.AtomicArray; import org.elasticsearch.index.shard.ShardId; diff --git a/server/src/test/java/org/elasticsearch/action/search/DfsQueryPhaseTests.java b/server/src/test/java/org/elasticsearch/action/search/DfsQueryPhaseTests.java index 0020769846781..e151792d67782 100644 --- a/server/src/test/java/org/elasticsearch/action/search/DfsQueryPhaseTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/DfsQueryPhaseTests.java @@ -13,7 +13,6 @@ import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.TotalHits; import org.apache.lucene.store.MockDirectoryWrapper; -import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.common.breaker.CircuitBreaker; import org.elasticsearch.common.breaker.NoopCircuitBreaker; import org.elasticsearch.common.lucene.search.TopDocsAndMaxScore; From 1a82d61cd5f0b542663f3348660a6fac16c222a8 Mon Sep 17 00:00:00 2001 From: jimczi Date: Thu, 30 Sep 2021 16:12:14 +0200 Subject: [PATCH 03/18] address review --- .../elasticsearch/action/search/AbstractSearchAsyncAction.java | 3 ++- .../org/elasticsearch/action/search/SearchPhaseContext.java | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java index e79ad2a6f4c8d..daf0ed5246b3c 100644 --- a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java @@ -113,7 +113,8 @@ abstract class AbstractSearchAsyncAction exten final List iterators = new ArrayList<>(); Map originalIndices = new HashMap<>(); for (final SearchShardIterator iterator : shardsIts) { - originalIndices.putIfAbsent(iterator.getClusterAlias(), iterator.getOriginalIndices()); + OriginalIndices ret = originalIndices.putIfAbsent(iterator.getClusterAlias(), iterator.getOriginalIndices()); + assert iterator.getOriginalIndices().equals(ret); if (iterator.skip()) { toSkipIterators.add(iterator); } else { diff --git a/server/src/main/java/org/elasticsearch/action/search/SearchPhaseContext.java b/server/src/main/java/org/elasticsearch/action/search/SearchPhaseContext.java index 5befaf5582b78..b413ab1cf75bd 100644 --- a/server/src/main/java/org/elasticsearch/action/search/SearchPhaseContext.java +++ b/server/src/main/java/org/elasticsearch/action/search/SearchPhaseContext.java @@ -50,7 +50,6 @@ interface SearchPhaseContext extends Executor { /** * Returns the targeted {@link OriginalIndices} for the provided cluster alias or the local cluster * if {@code clusterAlias} is {@code null}. - * or the local cluster */ OriginalIndices getOriginalIndices(@Nullable String clusterAlias); From 95350d74638eb0edf15004437b970d57f85e6f4c Mon Sep 17 00:00:00 2001 From: jimczi Date: Thu, 30 Sep 2021 16:13:49 +0200 Subject: [PATCH 04/18] iter --- .../elasticsearch/action/search/AbstractSearchAsyncAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java index daf0ed5246b3c..a89fbf49bbde3 100644 --- a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java @@ -114,7 +114,7 @@ abstract class AbstractSearchAsyncAction exten Map originalIndices = new HashMap<>(); for (final SearchShardIterator iterator : shardsIts) { OriginalIndices ret = originalIndices.putIfAbsent(iterator.getClusterAlias(), iterator.getOriginalIndices()); - assert iterator.getOriginalIndices().equals(ret); + assert iterator.getOriginalIndices() == ret; if (iterator.skip()) { toSkipIterators.add(iterator); } else { From cf409be8547039c19a53065fb3f3656eccb52d22 Mon Sep 17 00:00:00 2001 From: jimczi Date: Fri, 1 Oct 2021 09:20:17 +0200 Subject: [PATCH 05/18] different approach --- .../search/AbstractSearchAsyncAction.java | 31 +++++++--------- .../action/search/DfsQueryPhase.java | 4 +- .../action/search/FetchSearchPhase.java | 4 +- .../action/search/SearchPhaseContext.java | 5 +-- .../action/search/TransportSearchAction.java | 37 +++++++++++++------ .../action/search/MockSearchPhaseContext.java | 2 +- 6 files changed, 46 insertions(+), 37 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java index a89fbf49bbde3..8a186c5aa308f 100644 --- a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java @@ -23,7 +23,6 @@ import org.elasticsearch.action.support.TransportActions; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.routing.GroupShardsIterator; -import org.elasticsearch.core.Nullable; import org.elasticsearch.core.Releasable; import org.elasticsearch.core.Releasables; import org.elasticsearch.common.util.concurrent.AbstractRunnable; @@ -69,7 +68,6 @@ abstract class AbstractSearchAsyncAction exten private final Executor executor; private final ActionListener listener; private final SearchRequest request; - private final Map originalIndicesMap; /** * Used by subclasses to resolve node ids to DiscoveryNodes. @@ -90,7 +88,8 @@ abstract class AbstractSearchAsyncAction exten protected final GroupShardsIterator toSkipShardsIts; protected final GroupShardsIterator shardsIts; - private final Map shardItIndexMap; + private final SearchShardIterator[] shardIterators; + private final Map shardIndexMap; private final int expectedTotalOps; private final AtomicInteger totalOps = new AtomicInteger(); private final int maxConcurrentRequestsPerNode; @@ -111,29 +110,27 @@ abstract class AbstractSearchAsyncAction exten super(name); final List toSkipIterators = new ArrayList<>(); final List iterators = new ArrayList<>(); - Map originalIndices = new HashMap<>(); for (final SearchShardIterator iterator : shardsIts) { - OriginalIndices ret = originalIndices.putIfAbsent(iterator.getClusterAlias(), iterator.getOriginalIndices()); - assert iterator.getOriginalIndices() == ret; if (iterator.skip()) { toSkipIterators.add(iterator); } else { iterators.add(iterator); } } - this.originalIndicesMap = Collections.unmodifiableMap(originalIndices); this.toSkipShardsIts = new GroupShardsIterator<>(toSkipIterators); this.shardsIts = new GroupShardsIterator<>(iterators); - this.shardItIndexMap = new HashMap<>(); // we compute the shard index based on the natural order of the shards // that participate in the search request. This means that this number is // consistent between two requests that target the same shards. - List naturalOrder = new ArrayList<>(iterators); - CollectionUtil.timSort(naturalOrder); - for (int i = 0; i < naturalOrder.size(); i++) { - shardItIndexMap.put(naturalOrder.get(i), i); + Map shardMap = new HashMap<>(); + List searchIterators = new ArrayList<>(iterators); + CollectionUtil.timSort(iterators); + for (int i = 0; i < searchIterators.size(); i++) { + shardMap.put(searchIterators.get(i), i); } + this.shardIndexMap = Collections.unmodifiableMap(shardMap); + this.shardIterators = searchIterators.toArray(SearchShardIterator[]::new); // we need to add 1 for non active partition, since we count it in the total. This means for each shard in the iterator we sum up // it's number of active shards but use 1 as the default if no replica of a shard is active at this point. @@ -230,8 +227,8 @@ public final void run() { for (int i = 0; i < shardsIts.size(); i++) { final SearchShardIterator shardRoutings = shardsIts.get(i); assert shardRoutings.skip() == false; - assert shardItIndexMap.containsKey(shardRoutings); - int shardIndex = shardItIndexMap.get(shardRoutings); + assert shardIndexMap.containsKey(shardRoutings); + int shardIndex = shardIndexMap.get(shardRoutings); performPhaseOnShard(shardIndex, shardRoutings, shardRoutings.nextOrNull()); } } @@ -617,8 +614,8 @@ public final SearchRequest getRequest() { } @Override - public OriginalIndices getOriginalIndices(@Nullable String clusterAlias) { - return originalIndicesMap.get(clusterAlias); + public OriginalIndices getOriginalIndices(int shardIndex) { + return shardIterators[shardIndex].getOriginalIndices(); } @Override @@ -687,7 +684,7 @@ private void raisePhaseFailure(SearchPhaseExecutionException exception) { try { SearchShardTarget searchShardTarget = entry.getSearchShardTarget(); Transport.Connection connection = getConnection(searchShardTarget.getClusterAlias(), searchShardTarget.getNodeId()); - sendReleaseSearchContext(entry.getContextId(), connection, getOriginalIndices(searchShardTarget.getClusterAlias())); + sendReleaseSearchContext(entry.getContextId(), connection, getOriginalIndices(entry.getShardIndex())); } catch (Exception inner) { inner.addSuppressed(exception); logger.trace("failed to release context", inner); diff --git a/server/src/main/java/org/elasticsearch/action/search/DfsQueryPhase.java b/server/src/main/java/org/elasticsearch/action/search/DfsQueryPhase.java index 1642972de9144..76d60235162f9 100644 --- a/server/src/main/java/org/elasticsearch/action/search/DfsQueryPhase.java +++ b/server/src/main/java/org/elasticsearch/action/search/DfsQueryPhase.java @@ -66,7 +66,7 @@ public void run() throws IOException { for (final DfsSearchResult dfsResult : searchResults) { final SearchShardTarget shardTarget = dfsResult.getSearchShardTarget(); Transport.Connection connection = context.getConnection(shardTarget.getClusterAlias(), shardTarget.getNodeId()); - QuerySearchRequest querySearchRequest = new QuerySearchRequest(context.getOriginalIndices(shardTarget.getClusterAlias()), + QuerySearchRequest querySearchRequest = new QuerySearchRequest(context.getOriginalIndices(dfsResult.getShardIndex()), dfsResult.getContextId(), dfsResult.getShardSearchRequest(), dfs); final int shardIndex = dfsResult.getShardIndex(); searchTransportService.sendExecuteQuery(connection, querySearchRequest, context.getTask(), @@ -94,7 +94,7 @@ public void onFailure(Exception exception) { // execution) and the search context that was created in dfs phase might not be released. // release it again to be in the safe side context.sendReleaseSearchContext( - querySearchRequest.contextId(), connection, context.getOriginalIndices(shardTarget.getClusterAlias())); + querySearchRequest.contextId(), connection, context.getOriginalIndices(shardIndex)); } } } diff --git a/server/src/main/java/org/elasticsearch/action/search/FetchSearchPhase.java b/server/src/main/java/org/elasticsearch/action/search/FetchSearchPhase.java index 8f423b673d142..a54c055843aaf 100644 --- a/server/src/main/java/org/elasticsearch/action/search/FetchSearchPhase.java +++ b/server/src/main/java/org/elasticsearch/action/search/FetchSearchPhase.java @@ -139,7 +139,7 @@ private void innerRun() throws Exception { SearchShardTarget shardTarget = queryResult.getSearchShardTarget(); Transport.Connection connection = context.getConnection(shardTarget.getClusterAlias(), shardTarget.getNodeId()); ShardFetchSearchRequest fetchSearchRequest = createFetchRequest(queryResult.queryResult().getContextId(), i, entry, - lastEmittedDocPerShard, context.getOriginalIndices(shardTarget.getClusterAlias()), + lastEmittedDocPerShard, context.getOriginalIndices(queryResult.getShardIndex()), queryResult.getShardSearchRequest(), queryResult.getRescoreDocIds()); executeFetch(queryResult.getShardIndex(), shardTarget, counter, fetchSearchRequest, queryResult.queryResult(), connection); @@ -203,7 +203,7 @@ private void releaseIrrelevantSearchContext(QuerySearchResult queryResult) { SearchShardTarget shardTarget = queryResult.getSearchShardTarget(); Transport.Connection connection = context.getConnection(shardTarget.getClusterAlias(), shardTarget.getNodeId()); context.sendReleaseSearchContext(queryResult.getContextId(), connection, - context.getOriginalIndices(shardTarget.getClusterAlias())); + context.getOriginalIndices(queryResult.getShardIndex())); } catch (Exception e) { context.getLogger().trace("failed to release context", e); } diff --git a/server/src/main/java/org/elasticsearch/action/search/SearchPhaseContext.java b/server/src/main/java/org/elasticsearch/action/search/SearchPhaseContext.java index b413ab1cf75bd..5dc8e572cd8c1 100644 --- a/server/src/main/java/org/elasticsearch/action/search/SearchPhaseContext.java +++ b/server/src/main/java/org/elasticsearch/action/search/SearchPhaseContext.java @@ -48,10 +48,9 @@ interface SearchPhaseContext extends Executor { SearchRequest getRequest(); /** - * Returns the targeted {@link OriginalIndices} for the provided cluster alias or the local cluster - * if {@code clusterAlias} is {@code null}. + * Returns the targeted {@link OriginalIndices} for the provided {@code shardIndex}. */ - OriginalIndices getOriginalIndices(@Nullable String clusterAlias); + OriginalIndices getOriginalIndices(int shardIndex); /** * Checks if the given context id is part of the point in time of this search (if exists). diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index c9fc1f33288e0..87ffe5e349c46 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -550,15 +550,12 @@ static List getRemoteShardsIterator(Map getRemoteShardsIteratorFromPointInTime(Map localShardRoutings = clusterService.operationRouting().searchShards(clusterState, concreteLocalIndices, routingMap, searchRequest.preference(), searchService.getResponseCollectorService(), nodeSearchCounts); + aliasFilter = buildPerIndexAliasFilter(searchRequest, clusterState, indices, remoteAliasMap); localShardIterators = StreamSupport.stream(localShardRoutings.spliterator(), false) - .map(it -> new SearchShardIterator( - searchRequest.getLocalClusterAlias(), it.shardId(), it.getShardRoutings(), localIndices)) + .map(it -> { + final OriginalIndices originalIndices = getOriginalIndexOrAlias(it.shardId().getIndex(), + aliasFilter, localIndices.indicesOptions()); + return new SearchShardIterator(searchRequest.getLocalClusterAlias(), + it.shardId(), it.getShardRoutings(), originalIndices); + }) .collect(Collectors.toList()); - aliasFilter = buildPerIndexAliasFilter(searchRequest, clusterState, indices, remoteAliasMap); } final GroupShardsIterator shardIterators = mergeShardsIterators(localShardIterators, remoteShardIterators); @@ -950,10 +954,19 @@ static List getLocalLocalShardsIteratorFromPointInTime(Clus } } } - iterators.add(new SearchShardIterator(localClusterAlias, shardId, targetNodes, originalIndices, + iterators.add(new SearchShardIterator(localClusterAlias, shardId, targetNodes, + getOriginalIndexOrAlias(shardId.getIndex(), searchContext.aliasFilter(), originalIndices.indicesOptions()), perNode.getSearchContextId(), keepAlive)); } } return iterators; } + + static OriginalIndices getOriginalIndexOrAlias(Index index, + Map aliasFilter, + IndicesOptions indicesOptions) { + String[] aliases = aliasFilter.get(index.getUUID()).getAliases(); + String[] finalIndices = aliases.length == 0 ? new String[] { index.getName() } : aliases; + return new OriginalIndices(finalIndices, indicesOptions); + } } diff --git a/server/src/test/java/org/elasticsearch/action/search/MockSearchPhaseContext.java b/server/src/test/java/org/elasticsearch/action/search/MockSearchPhaseContext.java index 3d65aa72816ee..c609f275638f1 100644 --- a/server/src/test/java/org/elasticsearch/action/search/MockSearchPhaseContext.java +++ b/server/src/test/java/org/elasticsearch/action/search/MockSearchPhaseContext.java @@ -75,7 +75,7 @@ public SearchRequest getRequest() { } @Override - public OriginalIndices getOriginalIndices(String clusterAlias) { + public OriginalIndices getOriginalIndices(int shardIndex) { return new OriginalIndices(searchRequest.indices(), searchRequest.indicesOptions()); } From 4be77ba73881f54a6e9b086e47f23225fa57f58c Mon Sep 17 00:00:00 2001 From: jimczi Date: Fri, 1 Oct 2021 10:24:18 +0200 Subject: [PATCH 06/18] iter --- .../action/search/AbstractSearchAsyncAction.java | 2 +- .../elasticsearch/action/search/TransportSearchAction.java | 1 + .../action/search/AbstractSearchAsyncActionTests.java | 7 ++++++- .../action/search/TransportSearchActionTests.java | 5 ++++- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java index 8a186c5aa308f..8decbd3836f23 100644 --- a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java @@ -125,7 +125,7 @@ abstract class AbstractSearchAsyncAction exten // consistent between two requests that target the same shards. Map shardMap = new HashMap<>(); List searchIterators = new ArrayList<>(iterators); - CollectionUtil.timSort(iterators); + CollectionUtil.timSort(searchIterators); for (int i = 0; i < searchIterators.size(); i++) { shardMap.put(searchIterators.get(i), i); } diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index 87ffe5e349c46..4aff23b05f8b8 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -965,6 +965,7 @@ static List getLocalLocalShardsIteratorFromPointInTime(Clus static OriginalIndices getOriginalIndexOrAlias(Index index, Map aliasFilter, IndicesOptions indicesOptions) { + assert aliasFilter.get(index.getUUID()) != null; String[] aliases = aliasFilter.get(index.getUUID()).getAliases(); String[] finalIndices = aliases.length == 0 ? new String[] { index.getName() } : aliases; return new OriginalIndices(finalIndices, indicesOptions); diff --git a/server/src/test/java/org/elasticsearch/action/search/AbstractSearchAsyncActionTests.java b/server/src/test/java/org/elasticsearch/action/search/AbstractSearchAsyncActionTests.java index a55a3a3ce4a75..6c1e26c11dd05 100644 --- a/server/src/test/java/org/elasticsearch/action/search/AbstractSearchAsyncActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/AbstractSearchAsyncActionTests.java @@ -72,7 +72,7 @@ private AbstractSearchAsyncAction createAction(SearchRequest resolvedNodes.add(Tuple.tuple(cluster, node)); return null; }; - + OriginalIndices originalIndices = new OriginalIndices(request.indices(), request.indicesOptions()); return new AbstractSearchAsyncAction("test", logger, null, nodeIdToConnection, Collections.singletonMap("foo", new AliasFilter(new MatchAllQueryBuilder())), Collections.singletonMap("foo", 2.0f), null, request, listener, @@ -104,6 +104,11 @@ public void sendReleaseSearchContext(ShardSearchContextId contextId, Transport.C OriginalIndices originalIndices) { releasedContexts.add(contextId); } + + @Override + public OriginalIndices getOriginalIndices(int shardIndex) { + return originalIndices; + } }; } diff --git a/server/src/test/java/org/elasticsearch/action/search/TransportSearchActionTests.java b/server/src/test/java/org/elasticsearch/action/search/TransportSearchActionTests.java index d62a64d54914b..c76ef34298f9b 100644 --- a/server/src/test/java/org/elasticsearch/action/search/TransportSearchActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/TransportSearchActionTests.java @@ -974,6 +974,7 @@ public void testLocalShardIteratorFromPointInTime() { final IndexMetadata indexMetadata = clusterState.metadata().index("test-1"); Map contexts = new HashMap<>(); Set relocatedContexts = new HashSet<>(); + Map aliasFilterMap = new HashMap<>(); for (int shardId = 0; shardId < numberOfShards; shardId++) { final String targetNode; if (randomBoolean()) { @@ -987,13 +988,15 @@ public void testLocalShardIteratorFromPointInTime() { contexts.put(new ShardId(indexMetadata.getIndex(), shardId), new SearchContextIdForNode(null, targetNode, new ShardSearchContextId(UUIDs.randomBase64UUID(), randomNonNegativeLong(), null))); + aliasFilterMap.putIfAbsent(indexMetadata.getIndexUUID(), AliasFilter.EMPTY); } TimeValue keepAlive = randomBoolean() ? null : TimeValue.timeValueSeconds(between(30, 3600)); + final List shardIterators = TransportSearchAction.getLocalLocalShardsIteratorFromPointInTime( clusterState, OriginalIndices.NONE, null, - new SearchContextId(contexts, Map.of()), + new SearchContextId(contexts, aliasFilterMap), keepAlive ); shardIterators.sort(Comparator.comparing(SearchShardIterator::shardId)); From d626d38c6fb0eee474983edadbc90fc4b69b7768 Mon Sep 17 00:00:00 2001 From: jimczi Date: Fri, 1 Oct 2021 12:36:44 +0200 Subject: [PATCH 07/18] iter --- .../action/IndicesRequestIT.java | 24 ++++++++++---- .../TransportClusterSearchShardsAction.java | 6 ++-- .../query/TransportValidateQueryAction.java | 2 +- .../explain/TransportExplainAction.java | 2 +- .../action/search/TransportSearchAction.java | 2 +- .../cluster/metadata/DataStreamAlias.java | 4 +++ .../metadata/IndexNameExpressionResolver.java | 13 +++++--- .../elasticsearch/indices/IndicesService.java | 13 ++++++-- .../elasticsearch/search/SearchService.java | 4 +-- .../IndexNameExpressionResolverTests.java | 30 ++++++++--------- .../indices/IndicesServiceTests.java | 32 +++++++++++++++---- 11 files changed, 90 insertions(+), 42 deletions(-) diff --git a/server/src/internalClusterTest/java/org/elasticsearch/action/IndicesRequestIT.java b/server/src/internalClusterTest/java/org/elasticsearch/action/IndicesRequestIT.java index 8660f8c1ebb47..99e2130aa0a23 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/action/IndicesRequestIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/action/IndicesRequestIT.java @@ -555,9 +555,10 @@ public void testSearchQueryThenFetch() throws Exception { assertThat(searchResponse.getHits().getTotalHits().value, greaterThan(0L)); clearInterceptedActions(); - assertSameIndices(searchRequest, SearchTransportService.QUERY_ACTION_NAME, SearchTransportService.FETCH_ID_ACTION_NAME); + assertIndicesSubset(Arrays.asList(searchRequest.indices()), SearchTransportService.QUERY_ACTION_NAME, + SearchTransportService.FETCH_ID_ACTION_NAME); //free context messages are not necessarily sent, but if they are, check their indices - assertSameIndicesOptionalRequests(searchRequest, SearchTransportService.FREE_CONTEXT_ACTION_NAME); + assertIndicesSubsetOptionalRequests(Arrays.asList(searchRequest.indices()), SearchTransportService.FREE_CONTEXT_ACTION_NAME); } public void testSearchDfsQueryThenFetch() throws Exception { @@ -576,10 +577,10 @@ public void testSearchDfsQueryThenFetch() throws Exception { assertThat(searchResponse.getHits().getTotalHits().value, greaterThan(0L)); clearInterceptedActions(); - assertSameIndices(searchRequest, SearchTransportService.DFS_ACTION_NAME, SearchTransportService.QUERY_ID_ACTION_NAME, - SearchTransportService.FETCH_ID_ACTION_NAME); + assertIndicesSubset(Arrays.asList(searchRequest.indices()), SearchTransportService.DFS_ACTION_NAME, + SearchTransportService.QUERY_ID_ACTION_NAME, SearchTransportService.FETCH_ID_ACTION_NAME); //free context messages are not necessarily sent, but if they are, check their indices - assertSameIndicesOptionalRequests(searchRequest, SearchTransportService.FREE_CONTEXT_ACTION_NAME); + assertIndicesSubsetOptionalRequests(Arrays.asList(searchRequest.indices()), SearchTransportService.FREE_CONTEXT_ACTION_NAME); } private static void assertSameIndices(IndicesRequest originalRequest, String... actions) { @@ -603,11 +604,22 @@ private static void assertSameIndices(IndicesRequest originalRequest, boolean op } } } + private static void assertIndicesSubset(List indices, String... actions) { + assertIndicesSubset(indices, false, actions); + } + + private static void assertIndicesSubsetOptionalRequests(List indices, String... actions) { + assertIndicesSubset(indices, true, actions); + } + + private static void assertIndicesSubset(List indices, boolean optional, String... actions) { //indices returned by each bulk shard request need to be a subset of the original indices for (String action : actions) { List requests = consumeTransportRequests(action); - assertThat("no internal requests intercepted for action [" + action + "]", requests.size(), greaterThan(0)); + if (optional == false) { + assertThat("no internal requests intercepted for action [" + action + "]", requests.size(), greaterThan(0)); + } for (TransportRequest internalRequest : requests) { IndicesRequest indicesRequest = convertRequest(internalRequest); for (String index : indicesRequest.indices()) { diff --git a/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java b/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java index cd751fc9c53a5..baec988656348 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java @@ -62,9 +62,9 @@ protected void masterOperation(Task task, final ClusterSearchShardsRequest reque Map indicesAndFilters = new HashMap<>(); Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices()); for (String index : concreteIndices) { - final AliasFilter aliasFilter = indicesService.buildAliasFilter(clusterState, index, indicesAndAliases); - final String[] aliases = indexNameExpressionResolver.indexAliases(clusterState, index, aliasMetadata -> true, true, - indicesAndAliases); + final AliasFilter aliasFilter = indicesService.buildAliasFilter(clusterState, index, indicesAndAliases, true); + final String[] aliases = indexNameExpressionResolver.indexAliases(clusterState, index, + aliasMetadata -> true, dataStreamAlias -> true, true, indicesAndAliases); indicesAndFilters.put(index, new AliasFilter(aliasFilter.getQueryBuilder(), aliases)); } diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java b/server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java index 0f54322a25b8c..c31b58d964bc5 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java @@ -109,7 +109,7 @@ protected void doExecute(Task task, ValidateQueryRequest request, ActionListener protected ShardValidateQueryRequest newShardRequest(int numShards, ShardRouting shard, ValidateQueryRequest request) { final ClusterState clusterState = clusterService.state(); final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices()); - final AliasFilter aliasFilter = searchService.buildAliasFilter(clusterState, shard.getIndexName(), indicesAndAliases); + final AliasFilter aliasFilter = searchService.buildAliasFilter(clusterState, shard.getIndexName(), indicesAndAliases, true); return new ShardValidateQueryRequest(shard.shardId(), aliasFilter, request); } diff --git a/server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java b/server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java index ec577b747b9a1..92c4d2995984b 100644 --- a/server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java +++ b/server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java @@ -70,7 +70,7 @@ protected boolean resolveIndex(ExplainRequest request) { @Override protected void resolveRequest(ClusterState state, InternalRequest request) { final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions(state, request.request().index()); - final AliasFilter aliasFilter = searchService.buildAliasFilter(state, request.concreteIndex(), indicesAndAliases); + final AliasFilter aliasFilter = searchService.buildAliasFilter(state, request.concreteIndex(), indicesAndAliases, true); request.request().filteringAlias(aliasFilter); // Fail fast on the node that received the request. if (request.request().routing() == null && state.getMetadata().routingRequired(request.concreteIndex())) { diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index 4aff23b05f8b8..9e30f6fc205f6 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -146,7 +146,7 @@ private Map buildPerIndexAliasFilter(SearchRequest request, final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices()); for (Index index : concreteIndices) { clusterState.blocks().indexBlockedRaiseException(ClusterBlockLevel.READ, index.getName()); - AliasFilter aliasFilter = searchService.buildAliasFilter(clusterState, index.getName(), indicesAndAliases); + AliasFilter aliasFilter = searchService.buildAliasFilter(clusterState, index.getName(), indicesAndAliases, false); assert aliasFilter != null; aliasFilterMap.put(index.getUUID(), aliasFilter); } diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamAlias.java b/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamAlias.java index 5cc4555cb18ed..8f480886fadbe 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamAlias.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamAlias.java @@ -139,6 +139,10 @@ public CompressedXContent getFilter() { return filter; } + public boolean filteringRequired() { + return filter != null; + } + /** * Returns a new {@link DataStreamAlias} instance with the provided data stream name added to it as a new member. * If the provided isWriteDataStream is set to true then the provided data stream is also set as write data stream. diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java index a8ee8afc7ec4e..a5c5c6807fea8 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java @@ -518,7 +518,8 @@ public Set resolveExpressions(ClusterState state, String... expressions) * NOTE: The provided expressions must have been resolved already via {@link #resolveExpressions}. */ public String[] filteringAliases(ClusterState state, String index, Set resolvedExpressions) { - return indexAliases(state, index, AliasMetadata::filteringRequired, false, resolvedExpressions); + return indexAliases(state, index, + AliasMetadata::filteringRequired, DataStreamAlias::filteringRequired, false, resolvedExpressions); } /** @@ -537,8 +538,12 @@ boolean iterateIndexAliases(int indexAliasesSize, int resolvedExpressionsSize) { * the index itself - null is returned. Returns {@code null} if no filtering is required. *

NOTE: the provided expressions must have been resolved already via {@link #resolveExpressions}. */ - public String[] indexAliases(ClusterState state, String index, Predicate requiredAlias, boolean skipIdentity, - Set resolvedExpressions) { + public String[] indexAliases(ClusterState state, + String index, + Predicate requiredAlias, + Predicate requiredDataStreamAlias, + boolean skipIdentity, + Set resolvedExpressions) { if (isAllIndices(resolvedExpressions)) { return null; } @@ -565,7 +570,7 @@ public String[] indexAliases(ClusterState state, String index, Predicate dataStreamAlias.getDataStreams().contains(dataStream.getName())) - .filter(dataStreamAlias -> dataStreamAlias.getFilter() != null) + .filter(requiredDataStreamAlias) .map(DataStreamAlias::getName) .toArray(String[]::new); } else { diff --git a/server/src/main/java/org/elasticsearch/indices/IndicesService.java b/server/src/main/java/org/elasticsearch/indices/IndicesService.java index 02bb2e05b9654..e4fda4fc7d7a1 100644 --- a/server/src/main/java/org/elasticsearch/indices/IndicesService.java +++ b/server/src/main/java/org/elasticsearch/indices/IndicesService.java @@ -1519,7 +1519,7 @@ interface IndexDeletionAllowedPredicate { (Index index, IndexSettings indexSettings) -> canDeleteIndexContents(index); private final IndexDeletionAllowedPredicate ALWAYS_TRUE = (Index index, IndexSettings indexSettings) -> true; - public AliasFilter buildAliasFilter(ClusterState state, String index, Set resolvedExpressions) { + public AliasFilter buildAliasFilter(ClusterState state, String index, Set resolvedExpressions, boolean onlyFiltering) { /* Being static, parseAliasFilter doesn't have access to whatever guts it needs to parse a query. Instead of passing in a bunch * of dependencies we pass in a function that can perform the parsing. */ CheckedFunction filterParser = bytes -> { @@ -1529,7 +1529,9 @@ public AliasFilter buildAliasFilter(ClusterState state, String index, Set true, + dataStreamAlias -> true, true, resolvedExpressions); if (aliases == null) { return AliasFilter.EMPTY; } @@ -1540,6 +1542,9 @@ public AliasFilter buildAliasFilter(ClusterState state, String index, Set filters = Arrays.stream(aliases) .map(name -> metadata.dataStreamAliases().get(name)) .map(dataStreamAlias -> { + if (dataStreamAlias.getFilter() == null) { + return null; + } try { return filterParser.apply(dataStreamAlias.getFilter().uncompressed()); } catch (IOException e) { @@ -1555,6 +1560,10 @@ public AliasFilter buildAliasFilter(ClusterState state, String index, Set resolvedExpressions) { - return indicesService.buildAliasFilter(state, index, resolvedExpressions); + public AliasFilter buildAliasFilter(ClusterState state, String index, Set resolvedExpressions, boolean onlyFiltering) { + return indicesService.buildAliasFilter(state, index, resolvedExpressions, onlyFiltering); } public void canMatch(ShardSearchRequest request, ActionListener listener) { diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java index 7b0e78ed86c49..0de8e10d92aa0 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java @@ -1423,11 +1423,11 @@ public void testIndexAliases() { ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(state, "test-*"); - String[] strings = indexNameExpressionResolver.indexAliases(state, "test-0", x -> true, true, resolvedExpressions); + String[] strings = indexNameExpressionResolver.indexAliases(state, "test-0", x -> true, x -> true, true, resolvedExpressions); Arrays.sort(strings); assertArrayEquals(new String[] {"test-alias-0", "test-alias-1", "test-alias-non-filtering"}, strings); - strings = indexNameExpressionResolver.indexAliases(state, "test-0", x -> x.alias().equals("test-alias-1"), true, + strings = indexNameExpressionResolver.indexAliases(state, "test-0", x -> x.alias().equals("test-alias-1"), x -> false, true, resolvedExpressions); assertArrayEquals(null, strings); } @@ -1452,21 +1452,21 @@ public void testIndexAliasesDataStreamAliases() { // Only resolve aliases with with that refer to dataStreamName1 Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(state, "l*"); String index = backingIndex1.getIndex().getName(); - String[] result = indexNameExpressionResolver.indexAliases(state, index, x -> true, true, resolvedExpressions); + String[] result = indexNameExpressionResolver.indexAliases(state, index, x -> true, x -> true, true, resolvedExpressions); assertThat(result, arrayContainingInAnyOrder("logs_foo", "logs")); } { // Only resolve aliases with with that refer to dataStreamName2 Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(state, "l*"); String index = backingIndex2.getIndex().getName(); - String[] result = indexNameExpressionResolver.indexAliases(state, index, x -> true, true, resolvedExpressions); + String[] result = indexNameExpressionResolver.indexAliases(state, index, x -> true, x -> true, true, resolvedExpressions); assertThat(result, arrayContainingInAnyOrder("logs_baz")); } { // Null is returned, because skipping identity check and resolvedExpressions contains the backing index name Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(state, "l*"); String index = backingIndex2.getIndex().getName(); - String[] result = indexNameExpressionResolver.indexAliases(state, index, x -> true, false, resolvedExpressions); + String[] result = indexNameExpressionResolver.indexAliases(state, index, x -> true, x -> true, false, resolvedExpressions); assertThat(result, nullValue()); } } @@ -1480,15 +1480,15 @@ public void testIndexAliasesSkipIdentity() { ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); Set resolvedExpressions = new HashSet<>(Arrays.asList("test-0", "test-alias")); - String[] aliases = indexNameExpressionResolver.indexAliases(state, "test-0", x -> true, false, resolvedExpressions); + String[] aliases = indexNameExpressionResolver.indexAliases(state, "test-0", x -> true, x -> true, false, resolvedExpressions); assertNull(aliases); - aliases = indexNameExpressionResolver.indexAliases(state, "test-0", x -> true, true, resolvedExpressions); + aliases = indexNameExpressionResolver.indexAliases(state, "test-0", x -> true, x -> true, true, resolvedExpressions); assertArrayEquals(new String[] {"test-alias"}, aliases); resolvedExpressions = Collections.singleton("other-alias"); - aliases = indexNameExpressionResolver.indexAliases(state, "test-0", x -> true, false, resolvedExpressions); + aliases = indexNameExpressionResolver.indexAliases(state, "test-0", x -> true, x -> true, false, resolvedExpressions); assertArrayEquals(new String[] {"other-alias"}, aliases); - aliases = indexNameExpressionResolver.indexAliases(state, "test-0", x -> true, true, resolvedExpressions); + aliases = indexNameExpressionResolver.indexAliases(state, "test-0", x -> true, x -> true, true, resolvedExpressions); assertArrayEquals(new String[] {"other-alias"}, aliases); } @@ -1499,7 +1499,7 @@ public void testConcreteWriteIndexSuccessful() { .putAlias(AliasMetadata.builder("test-alias").writeIndex(testZeroWriteIndex ? true : null))); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); String[] strings = indexNameExpressionResolver - .indexAliases(state, "test-0", x -> true, true, new HashSet<>(Arrays.asList("test-0", "test-alias"))); + .indexAliases(state, "test-0", x -> true, x -> true, true, new HashSet<>(Arrays.asList("test-0", "test-alias"))); Arrays.sort(strings); assertArrayEquals(new String[] {"test-alias"}, strings); IndicesRequest request = new IndicesRequest() { @@ -1570,7 +1570,7 @@ public void testConcreteWriteIndexWithWildcardExpansion() { .putAlias(AliasMetadata.builder("test-alias").writeIndex(testZeroWriteIndex ? randomFrom(false, null) : true))); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); String[] strings = indexNameExpressionResolver - .indexAliases(state, "test-0", x -> true, true, new HashSet<>(Arrays.asList("test-0", "test-1", "test-alias"))); + .indexAliases(state, "test-0", x -> true, x -> true, true, new HashSet<>(Arrays.asList("test-0", "test-1", "test-alias"))); Arrays.sort(strings); assertArrayEquals(new String[] {"test-alias"}, strings); IndicesRequest request = new IndicesRequest() { @@ -1603,7 +1603,7 @@ public void testConcreteWriteIndexWithNoWriteIndexWithSingleIndex() { .putAlias(AliasMetadata.builder("test-alias").writeIndex(false))); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); String[] strings = indexNameExpressionResolver - .indexAliases(state, "test-0", x -> true, true, new HashSet<>(Arrays.asList("test-0", "test-alias"))); + .indexAliases(state, "test-0", x -> true, x -> true, true, new HashSet<>(Arrays.asList("test-0", "test-alias"))); Arrays.sort(strings); assertArrayEquals(new String[] {"test-alias"}, strings); DocWriteRequest request = randomFrom(new IndexRequest("test-alias"), @@ -1623,7 +1623,7 @@ public void testConcreteWriteIndexWithNoWriteIndexWithMultipleIndices() { .putAlias(AliasMetadata.builder("test-alias").writeIndex(randomFrom(false, null)))); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); String[] strings = indexNameExpressionResolver - .indexAliases(state, "test-0", x -> true, true, new HashSet<>(Arrays.asList("test-0", "test-1", "test-alias"))); + .indexAliases(state, "test-0", x -> true, x -> true, true, new HashSet<>(Arrays.asList("test-0", "test-1", "test-alias"))); Arrays.sort(strings); assertArrayEquals(new String[] {"test-alias"}, strings); DocWriteRequest request = randomFrom(new IndexRequest("test-alias"), @@ -1644,7 +1644,7 @@ public void testAliasResolutionNotAllowingMultipleIndices() { .putAlias(AliasMetadata.builder("test-alias").writeIndex(randomFrom(test0WriteIndex == false, null)))); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); String[] strings = indexNameExpressionResolver - .indexAliases(state, "test-0", x -> true, true, new HashSet<>(Arrays.asList("test-0", "test-1", "test-alias"))); + .indexAliases(state, "test-0", x -> true, x -> true, true, new HashSet<>(Arrays.asList("test-0", "test-1", "test-alias"))); Arrays.sort(strings); assertArrayEquals(new String[] {"test-alias"}, strings); IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, @@ -2268,7 +2268,7 @@ public void testDataStreamsWithWildcardExpression() { assertThat(result[0].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream1, 1, epochMillis))); assertThat(result[1].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream1, 2, epochMillis))); assertThat(result[2].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream2, 1, epochMillis))); - assertThat(result[3].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream2, 2, epochMillis)));; + assertThat(result[3].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream2, 2, epochMillis))); } { IndicesOptions indicesOptions = IndicesOptions.STRICT_EXPAND_OPEN; diff --git a/server/src/test/java/org/elasticsearch/indices/IndicesServiceTests.java b/server/src/test/java/org/elasticsearch/indices/IndicesServiceTests.java index d07f018a80b29..079feec211608 100644 --- a/server/src/test/java/org/elasticsearch/indices/IndicesServiceTests.java +++ b/server/src/test/java/org/elasticsearch/indices/IndicesServiceTests.java @@ -581,17 +581,17 @@ public void testBuildAliasFilter() { ); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); { - AliasFilter result = indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0")); + AliasFilter result = indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0"), true); assertThat(result.getAliases(), arrayContainingInAnyOrder("test-alias-0")); assertThat(result.getQueryBuilder(), equalTo(QueryBuilders.termQuery("foo", "bar"))); } { - AliasFilter result = indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-1")); + AliasFilter result = indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-1"), true); assertThat(result.getAliases(), arrayContainingInAnyOrder("test-alias-1")); assertThat(result.getQueryBuilder(), equalTo(QueryBuilders.termQuery("foo", "baz"))); } { - AliasFilter result = indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0", "test-alias-1")); + AliasFilter result = indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0", "test-alias-1"), true); assertThat(result.getAliases(), arrayContainingInAnyOrder("test-alias-0", "test-alias-1")); BoolQueryBuilder filter = (BoolQueryBuilder) result.getQueryBuilder(); assertThat(filter.filter(), empty()); @@ -601,10 +601,16 @@ public void testBuildAliasFilter() { } { AliasFilter result = - indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0", "test-alias-1", "test-alias-non-filtering")); + indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0", "test-alias-1", "test-alias-non-filtering"), true); assertThat(result.getAliases(), emptyArray()); assertThat(result.getQueryBuilder(), nullValue()); } + { + AliasFilter result = + indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0", "test-alias-1", "test-alias-non-filtering"), false); + assertThat(result.getAliases(), arrayContainingInAnyOrder("test-alias-0", "test-alias-1", "test-alias-non-filtering")); + assertThat(result.getQueryBuilder(), nullValue()); + } } public void testBuildAliasFilterDataStreamAliases() { @@ -621,13 +627,13 @@ public void testBuildAliasFilterDataStreamAliases() { ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); { String index = backingIndex1.getIndex().getName(); - AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo")); + AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo"), true); assertThat(result.getAliases(), arrayContainingInAnyOrder("logs_foo")); assertThat(result.getQueryBuilder(), equalTo(QueryBuilders.termQuery("foo", "bar"))); } { String index = backingIndex1.getIndex().getName(); - AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo", "logs")); + AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo", "logs"), true); assertThat(result.getAliases(), arrayContainingInAnyOrder("logs_foo", "logs")); BoolQueryBuilder filter = (BoolQueryBuilder) result.getQueryBuilder(); assertThat(filter.filter(), empty()); @@ -637,7 +643,7 @@ public void testBuildAliasFilterDataStreamAliases() { } { String index = backingIndex1.getIndex().getName(); - AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo", "logs", "logs_bar")); + AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo", "logs", "logs_bar"), true); assertThat(result.getAliases(), arrayContainingInAnyOrder("logs_foo", "logs")); BoolQueryBuilder filter = (BoolQueryBuilder) result.getQueryBuilder(); assertThat(filter.filter(), empty()); @@ -645,5 +651,17 @@ public void testBuildAliasFilterDataStreamAliases() { assertThat(filter.mustNot(), empty()); assertThat(filter.should(), containsInAnyOrder(QueryBuilders.termQuery("foo", "baz"), QueryBuilders.termQuery("foo", "bar"))); } + { + String index = backingIndex1.getIndex().getName(); + AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo", "logs", "logs_bar"), false); + assertThat(result.getAliases(), arrayContainingInAnyOrder("logs_foo", "logs", "logs_bar")); + assertNull(result.getQueryBuilder()); + } + { + String index = backingIndex1.getIndex().getName(); + AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_bar"), false); + assertThat(result.getAliases(), arrayContainingInAnyOrder("logs_bar")); + assertNull(result.getQueryBuilder()); + } } } From 84deb2e9e3e961cf0767b605f581e025f502d07e Mon Sep 17 00:00:00 2001 From: jimczi Date: Fri, 1 Oct 2021 14:30:38 +0200 Subject: [PATCH 08/18] iter2 --- .../action/search/AbstractSearchAsyncAction.java | 4 ++++ .../cluster/metadata/IndexNameExpressionResolverTests.java | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java index 8decbd3836f23..cf49bf36f4fb8 100644 --- a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java @@ -731,6 +731,10 @@ public final void onFailure(Exception e) { @Override public final ShardSearchRequest buildShardSearchRequest(SearchShardIterator shardIt, int shardIndex) { AliasFilter filter = aliasFilter.get(shardIt.shardId().getIndex().getUUID()); + if (filter.getQueryBuilder() == null) { + // rewrite to a match_all alias + filter = AliasFilter.EMPTY; + } assert filter != null; float indexBoost = concreteIndexBoosts.getOrDefault(shardIt.shardId().getIndex().getUUID(), DEFAULT_INDEX_BOOST); ShardSearchRequest shardRequest = new ShardSearchRequest(shardIt.getOriginalIndices(), request, diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java index 0de8e10d92aa0..b170238143776 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java @@ -1453,14 +1453,14 @@ public void testIndexAliasesDataStreamAliases() { Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(state, "l*"); String index = backingIndex1.getIndex().getName(); String[] result = indexNameExpressionResolver.indexAliases(state, index, x -> true, x -> true, true, resolvedExpressions); - assertThat(result, arrayContainingInAnyOrder("logs_foo", "logs")); + assertThat(result, arrayContainingInAnyOrder("logs_foo", "logs", "logs_bar")); } { // Only resolve aliases with with that refer to dataStreamName2 Set resolvedExpressions = indexNameExpressionResolver.resolveExpressions(state, "l*"); String index = backingIndex2.getIndex().getName(); String[] result = indexNameExpressionResolver.indexAliases(state, index, x -> true, x -> true, true, resolvedExpressions); - assertThat(result, arrayContainingInAnyOrder("logs_baz")); + assertThat(result, arrayContainingInAnyOrder("logs_baz", "logs_baz2")); } { // Null is returned, because skipping identity check and resolvedExpressions contains the backing index name From dd985dd364bdb695958227c00cb57f3915532eb0 Mon Sep 17 00:00:00 2001 From: jimczi Date: Fri, 1 Oct 2021 15:21:56 +0200 Subject: [PATCH 09/18] don't skip identity index when creating alias filters --- .../src/main/java/org/elasticsearch/indices/IndicesService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/indices/IndicesService.java b/server/src/main/java/org/elasticsearch/indices/IndicesService.java index e4fda4fc7d7a1..808993d11df9d 100644 --- a/server/src/main/java/org/elasticsearch/indices/IndicesService.java +++ b/server/src/main/java/org/elasticsearch/indices/IndicesService.java @@ -1531,7 +1531,7 @@ public AliasFilter buildAliasFilter(ClusterState state, String index, Set true, - dataStreamAlias -> true, true, resolvedExpressions); + dataStreamAlias -> true, false, resolvedExpressions); if (aliases == null) { return AliasFilter.EMPTY; } From 3e83bf1530b533785324a19f4351f67677a865ad Mon Sep 17 00:00:00 2001 From: jimczi Date: Mon, 4 Oct 2021 10:16:55 +0200 Subject: [PATCH 10/18] preserve concrete index name when needed --- .../action/search/TransportSearchAction.java | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index 9e30f6fc205f6..8c30e4655da96 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -140,10 +140,11 @@ public TransportSearchAction(ThreadPool threadPool, this.executorSelector = executorSelector; } - private Map buildPerIndexAliasFilter(SearchRequest request, ClusterState clusterState, - Index[] concreteIndices, Map remoteAliasMap) { + private Map buildPerIndexAliasFilter(ClusterState clusterState, + Set indicesAndAliases, + Index[] concreteIndices, + Map remoteAliasMap) { final Map aliasFilterMap = new HashMap<>(); - final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices()); for (Index index : concreteIndices) { clusterState.blocks().indexBlockedRaiseException(ClusterBlockLevel.READ, index.getName()); AliasFilter aliasFilter = searchService.buildAliasFilter(clusterState, index.getName(), indicesAndAliases, false); @@ -552,7 +553,7 @@ static List getRemoteShardsIterator(Map getRemoteShardsIteratorFromPointInTime(Map localShardRoutings = clusterService.operationRouting().searchShards(clusterState, concreteLocalIndices, routingMap, searchRequest.preference(), searchService.getResponseCollectorService(), nodeSearchCounts); - aliasFilter = buildPerIndexAliasFilter(searchRequest, clusterState, indices, remoteAliasMap); + final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, searchRequest.indices()); + aliasFilter = buildPerIndexAliasFilter(clusterState, indicesAndAliases, indices, remoteAliasMap); localShardIterators = StreamSupport.stream(localShardRoutings.spliterator(), false) .map(it -> { - final OriginalIndices originalIndices = getOriginalIndexOrAlias(it.shardId().getIndex(), - aliasFilter, localIndices.indicesOptions()); + final OriginalIndices finalIndices = getOriginalIndexAndAliases(it.shardId().getIndex(), + indicesAndAliases, aliasFilter, localIndices.indicesOptions()); return new SearchShardIterator(searchRequest.getLocalClusterAlias(), - it.shardId(), it.getShardRoutings(), originalIndices); + it.shardId(), it.getShardRoutings(), finalIndices); }) .collect(Collectors.toList()); } @@ -955,19 +957,28 @@ static List getLocalLocalShardsIteratorFromPointInTime(Clus } } iterators.add(new SearchShardIterator(localClusterAlias, shardId, targetNodes, - getOriginalIndexOrAlias(shardId.getIndex(), searchContext.aliasFilter(), originalIndices.indicesOptions()), + getOriginalIndexAndAliases(shardId.getIndex(), Collections.emptySet(), + searchContext.aliasFilter(), originalIndices.indicesOptions()), perNode.getSearchContextId(), keepAlive)); } } return iterators; } - static OriginalIndices getOriginalIndexOrAlias(Index index, - Map aliasFilter, - IndicesOptions indicesOptions) { + /** + * Returns the actual concrete index and aliases that expanded to the concrete {@link Index}. + */ + static OriginalIndices getOriginalIndexAndAliases(Index index, + Set resolvedIndicesAndAliases, + Map aliasFilter, + IndicesOptions indicesOptions) { assert aliasFilter.get(index.getUUID()) != null; String[] aliases = aliasFilter.get(index.getUUID()).getAliases(); - String[] finalIndices = aliases.length == 0 ? new String[] { index.getName() } : aliases; - return new OriginalIndices(finalIndices, indicesOptions); + List finalIndices = new ArrayList<>(); + if (aliases.length == 0 || resolvedIndicesAndAliases.contains(index.getName())) { + finalIndices.add(index.getName()); + } + finalIndices.addAll(Arrays.asList(aliases)); + return new OriginalIndices(finalIndices.toArray(String[]::new), indicesOptions); } } From 82beb936499284e32b5f207f5f28bce21be6ab58 Mon Sep 17 00:00:00 2001 From: jimczi Date: Mon, 4 Oct 2021 13:44:37 +0200 Subject: [PATCH 11/18] separate alias filter and original indices creation --- .../TransportClusterSearchShardsAction.java | 2 +- .../query/TransportValidateQueryAction.java | 2 +- .../explain/TransportExplainAction.java | 2 +- .../search/AbstractSearchAsyncAction.java | 4 - .../action/search/TransportSearchAction.java | 74 +++++++++++-------- .../elasticsearch/indices/IndicesService.java | 15 +--- .../elasticsearch/search/SearchService.java | 4 +- .../indices/IndicesServiceTests.java | 32 ++------ ...onsWithAliasesWildcardsAndRegexsTests.java | 69 ++++++++++++++++- 9 files changed, 125 insertions(+), 79 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java b/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java index baec988656348..756046843cec4 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java @@ -62,7 +62,7 @@ protected void masterOperation(Task task, final ClusterSearchShardsRequest reque Map indicesAndFilters = new HashMap<>(); Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices()); for (String index : concreteIndices) { - final AliasFilter aliasFilter = indicesService.buildAliasFilter(clusterState, index, indicesAndAliases, true); + final AliasFilter aliasFilter = indicesService.buildAliasFilter(clusterState, index, indicesAndAliases); final String[] aliases = indexNameExpressionResolver.indexAliases(clusterState, index, aliasMetadata -> true, dataStreamAlias -> true, true, indicesAndAliases); indicesAndFilters.put(index, new AliasFilter(aliasFilter.getQueryBuilder(), aliases)); diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java b/server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java index c31b58d964bc5..0f54322a25b8c 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java @@ -109,7 +109,7 @@ protected void doExecute(Task task, ValidateQueryRequest request, ActionListener protected ShardValidateQueryRequest newShardRequest(int numShards, ShardRouting shard, ValidateQueryRequest request) { final ClusterState clusterState = clusterService.state(); final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices()); - final AliasFilter aliasFilter = searchService.buildAliasFilter(clusterState, shard.getIndexName(), indicesAndAliases, true); + final AliasFilter aliasFilter = searchService.buildAliasFilter(clusterState, shard.getIndexName(), indicesAndAliases); return new ShardValidateQueryRequest(shard.shardId(), aliasFilter, request); } diff --git a/server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java b/server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java index 92c4d2995984b..ec577b747b9a1 100644 --- a/server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java +++ b/server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java @@ -70,7 +70,7 @@ protected boolean resolveIndex(ExplainRequest request) { @Override protected void resolveRequest(ClusterState state, InternalRequest request) { final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions(state, request.request().index()); - final AliasFilter aliasFilter = searchService.buildAliasFilter(state, request.concreteIndex(), indicesAndAliases, true); + final AliasFilter aliasFilter = searchService.buildAliasFilter(state, request.concreteIndex(), indicesAndAliases); request.request().filteringAlias(aliasFilter); // Fail fast on the node that received the request. if (request.request().routing() == null && state.getMetadata().routingRequired(request.concreteIndex())) { diff --git a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java index cf49bf36f4fb8..8decbd3836f23 100644 --- a/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/AbstractSearchAsyncAction.java @@ -731,10 +731,6 @@ public final void onFailure(Exception e) { @Override public final ShardSearchRequest buildShardSearchRequest(SearchShardIterator shardIt, int shardIndex) { AliasFilter filter = aliasFilter.get(shardIt.shardId().getIndex().getUUID()); - if (filter.getQueryBuilder() == null) { - // rewrite to a match_all alias - filter = AliasFilter.EMPTY; - } assert filter != null; float indexBoost = concreteIndexBoosts.getOrDefault(shardIt.shardId().getIndex().getUUID(), DEFAULT_INDEX_BOOST); ShardSearchRequest shardRequest = new ShardSearchRequest(shardIt.getOriginalIndices(), request, diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index 8c30e4655da96..413a6ce29ef70 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -8,6 +8,7 @@ package org.elasticsearch.action.search; +import org.apache.lucene.index.IndexOptions; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.admin.cluster.shards.ClusterSearchShardsGroup; @@ -140,6 +141,28 @@ public TransportSearchAction(ThreadPool threadPool, this.executorSelector = executorSelector; } + private Map buildPerIndexOriginalIndices(ClusterState clusterState, + Set indicesAndAliases, + Index[] concreteIndices, + IndicesOptions indicesOptions) { + Map res = new HashMap<>(); + for (Index index : concreteIndices) { + clusterState.blocks().indexBlockedRaiseException(ClusterBlockLevel.READ, index.getName()); + String[] aliases = indexNameExpressionResolver.indexAliases(clusterState, index.getName(), aliasMetadata -> true, + dataStreamAlias -> true, true, indicesAndAliases); + List finalIndices = new ArrayList<>(); + if (indicesAndAliases.contains(index.getName()) + || aliases == null || aliases.length == 0) { + finalIndices.add(index.getName()); + } + if (aliases != null) { + finalIndices.addAll(Arrays.asList(aliases)); + } + res.put(index.getUUID(), new OriginalIndices(finalIndices.toArray(String[]::new), indicesOptions)); + } + return Collections.unmodifiableMap(res); + } + private Map buildPerIndexAliasFilter(ClusterState clusterState, Set indicesAndAliases, Index[] concreteIndices, @@ -147,7 +170,7 @@ private Map buildPerIndexAliasFilter(ClusterState clusterSt final Map aliasFilterMap = new HashMap<>(); for (Index index : concreteIndices) { clusterState.blocks().indexBlockedRaiseException(ClusterBlockLevel.READ, index.getName()); - AliasFilter aliasFilter = searchService.buildAliasFilter(clusterState, index.getName(), indicesAndAliases, false); + AliasFilter aliasFilter = searchService.buildAliasFilter(clusterState, index.getName(), indicesAndAliases); assert aliasFilter != null; aliasFilterMap.put(index.getUUID(), aliasFilter); } @@ -551,12 +574,15 @@ static List getRemoteShardsIterator(Map getRemoteShardsIteratorFromPointInTime(Map indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, searchRequest.indices()); aliasFilter = buildPerIndexAliasFilter(clusterState, indicesAndAliases, indices, remoteAliasMap); + final Map finalIndicesMap = + buildPerIndexOriginalIndices(clusterState, indicesAndAliases, indices, localIndices.indicesOptions()); localShardIterators = StreamSupport.stream(localShardRoutings.spliterator(), false) .map(it -> { - final OriginalIndices finalIndices = getOriginalIndexAndAliases(it.shardId().getIndex(), - indicesAndAliases, aliasFilter, localIndices.indicesOptions()); - return new SearchShardIterator(searchRequest.getLocalClusterAlias(), - it.shardId(), it.getShardRoutings(), finalIndices); + OriginalIndices finalIndices = finalIndicesMap.get(it.shardId().getIndex().getUUID()); + assert finalIndices != null; + return new SearchShardIterator(searchRequest.getLocalClusterAlias(), it.shardId(), it.getShardRoutings(), finalIndices); }) .collect(Collectors.toList()); } @@ -956,29 +983,12 @@ static List getLocalLocalShardsIteratorFromPointInTime(Clus } } } - iterators.add(new SearchShardIterator(localClusterAlias, shardId, targetNodes, - getOriginalIndexAndAliases(shardId.getIndex(), Collections.emptySet(), - searchContext.aliasFilter(), originalIndices.indicesOptions()), + OriginalIndices finalIndices = new OriginalIndices(new String[] { shardId.getIndexName() }, + originalIndices.indicesOptions()); + iterators.add(new SearchShardIterator(localClusterAlias, shardId, targetNodes, finalIndices, perNode.getSearchContextId(), keepAlive)); } } return iterators; } - - /** - * Returns the actual concrete index and aliases that expanded to the concrete {@link Index}. - */ - static OriginalIndices getOriginalIndexAndAliases(Index index, - Set resolvedIndicesAndAliases, - Map aliasFilter, - IndicesOptions indicesOptions) { - assert aliasFilter.get(index.getUUID()) != null; - String[] aliases = aliasFilter.get(index.getUUID()).getAliases(); - List finalIndices = new ArrayList<>(); - if (aliases.length == 0 || resolvedIndicesAndAliases.contains(index.getName())) { - finalIndices.add(index.getName()); - } - finalIndices.addAll(Arrays.asList(aliases)); - return new OriginalIndices(finalIndices.toArray(String[]::new), indicesOptions); - } } diff --git a/server/src/main/java/org/elasticsearch/indices/IndicesService.java b/server/src/main/java/org/elasticsearch/indices/IndicesService.java index 808993d11df9d..209690adf076f 100644 --- a/server/src/main/java/org/elasticsearch/indices/IndicesService.java +++ b/server/src/main/java/org/elasticsearch/indices/IndicesService.java @@ -1519,19 +1519,17 @@ interface IndexDeletionAllowedPredicate { (Index index, IndexSettings indexSettings) -> canDeleteIndexContents(index); private final IndexDeletionAllowedPredicate ALWAYS_TRUE = (Index index, IndexSettings indexSettings) -> true; - public AliasFilter buildAliasFilter(ClusterState state, String index, Set resolvedExpressions, boolean onlyFiltering) { + public AliasFilter buildAliasFilter(ClusterState state, String index, Set resolvedExpressions) { /* Being static, parseAliasFilter doesn't have access to whatever guts it needs to parse a query. Instead of passing in a bunch * of dependencies we pass in a function that can perform the parsing. */ CheckedFunction filterParser = bytes -> { try (InputStream inputStream = bytes.streamInput(); XContentParser parser = XContentFactory.xContentType(inputStream).xContent() - .createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, inputStream)) { + .createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, inputStream)) { return parseInnerQueryBuilder(parser); } }; - String[] aliases = onlyFiltering ? indexNameExpressionResolver.filteringAliases(state, index, resolvedExpressions) - : indexNameExpressionResolver.indexAliases(state, index, aliasMetadata -> true, - dataStreamAlias -> true, false, resolvedExpressions); + String[] aliases = indexNameExpressionResolver.filteringAliases(state, index, resolvedExpressions); if (aliases == null) { return AliasFilter.EMPTY; } @@ -1542,9 +1540,6 @@ public AliasFilter buildAliasFilter(ClusterState state, String index, Set filters = Arrays.stream(aliases) .map(name -> metadata.dataStreamAliases().get(name)) .map(dataStreamAlias -> { - if (dataStreamAlias.getFilter() == null) { - return null; - } try { return filterParser.apply(dataStreamAlias.getFilter().uncompressed()); } catch (IOException e) { @@ -1560,10 +1555,6 @@ public AliasFilter buildAliasFilter(ClusterState state, String index, Set resolvedExpressions, boolean onlyFiltering) { - return indicesService.buildAliasFilter(state, index, resolvedExpressions, onlyFiltering); + public AliasFilter buildAliasFilter(ClusterState state, String index, Set resolvedExpressions) { + return indicesService.buildAliasFilter(state, index, resolvedExpressions); } public void canMatch(ShardSearchRequest request, ActionListener listener) { diff --git a/server/src/test/java/org/elasticsearch/indices/IndicesServiceTests.java b/server/src/test/java/org/elasticsearch/indices/IndicesServiceTests.java index 079feec211608..d07f018a80b29 100644 --- a/server/src/test/java/org/elasticsearch/indices/IndicesServiceTests.java +++ b/server/src/test/java/org/elasticsearch/indices/IndicesServiceTests.java @@ -581,17 +581,17 @@ public void testBuildAliasFilter() { ); ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); { - AliasFilter result = indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0"), true); + AliasFilter result = indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0")); assertThat(result.getAliases(), arrayContainingInAnyOrder("test-alias-0")); assertThat(result.getQueryBuilder(), equalTo(QueryBuilders.termQuery("foo", "bar"))); } { - AliasFilter result = indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-1"), true); + AliasFilter result = indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-1")); assertThat(result.getAliases(), arrayContainingInAnyOrder("test-alias-1")); assertThat(result.getQueryBuilder(), equalTo(QueryBuilders.termQuery("foo", "baz"))); } { - AliasFilter result = indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0", "test-alias-1"), true); + AliasFilter result = indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0", "test-alias-1")); assertThat(result.getAliases(), arrayContainingInAnyOrder("test-alias-0", "test-alias-1")); BoolQueryBuilder filter = (BoolQueryBuilder) result.getQueryBuilder(); assertThat(filter.filter(), empty()); @@ -601,16 +601,10 @@ public void testBuildAliasFilter() { } { AliasFilter result = - indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0", "test-alias-1", "test-alias-non-filtering"), true); + indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0", "test-alias-1", "test-alias-non-filtering")); assertThat(result.getAliases(), emptyArray()); assertThat(result.getQueryBuilder(), nullValue()); } - { - AliasFilter result = - indicesService.buildAliasFilter(state, "test-0", Set.of("test-alias-0", "test-alias-1", "test-alias-non-filtering"), false); - assertThat(result.getAliases(), arrayContainingInAnyOrder("test-alias-0", "test-alias-1", "test-alias-non-filtering")); - assertThat(result.getQueryBuilder(), nullValue()); - } } public void testBuildAliasFilterDataStreamAliases() { @@ -627,13 +621,13 @@ public void testBuildAliasFilterDataStreamAliases() { ClusterState state = ClusterState.builder(new ClusterName("_name")).metadata(mdBuilder).build(); { String index = backingIndex1.getIndex().getName(); - AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo"), true); + AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo")); assertThat(result.getAliases(), arrayContainingInAnyOrder("logs_foo")); assertThat(result.getQueryBuilder(), equalTo(QueryBuilders.termQuery("foo", "bar"))); } { String index = backingIndex1.getIndex().getName(); - AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo", "logs"), true); + AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo", "logs")); assertThat(result.getAliases(), arrayContainingInAnyOrder("logs_foo", "logs")); BoolQueryBuilder filter = (BoolQueryBuilder) result.getQueryBuilder(); assertThat(filter.filter(), empty()); @@ -643,7 +637,7 @@ public void testBuildAliasFilterDataStreamAliases() { } { String index = backingIndex1.getIndex().getName(); - AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo", "logs", "logs_bar"), true); + AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo", "logs", "logs_bar")); assertThat(result.getAliases(), arrayContainingInAnyOrder("logs_foo", "logs")); BoolQueryBuilder filter = (BoolQueryBuilder) result.getQueryBuilder(); assertThat(filter.filter(), empty()); @@ -651,17 +645,5 @@ public void testBuildAliasFilterDataStreamAliases() { assertThat(filter.mustNot(), empty()); assertThat(filter.should(), containsInAnyOrder(QueryBuilders.termQuery("foo", "baz"), QueryBuilders.termQuery("foo", "bar"))); } - { - String index = backingIndex1.getIndex().getName(); - AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_foo", "logs", "logs_bar"), false); - assertThat(result.getAliases(), arrayContainingInAnyOrder("logs_foo", "logs", "logs_bar")); - assertNull(result.getQueryBuilder()); - } - { - String index = backingIndex1.getIndex().getName(); - AliasFilter result = indicesService.buildAliasFilter(state, index, Set.of("logs_bar"), false); - assertThat(result.getAliases(), arrayContainingInAnyOrder("logs_bar")); - assertNull(result.getQueryBuilder()); - } } } diff --git a/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/IndicesPermissionsWithAliasesWildcardsAndRegexsTests.java b/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/IndicesPermissionsWithAliasesWildcardsAndRegexsTests.java index 41e70fad926b7..cc1e96f6d8f77 100644 --- a/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/IndicesPermissionsWithAliasesWildcardsAndRegexsTests.java +++ b/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/IndicesPermissionsWithAliasesWildcardsAndRegexsTests.java @@ -8,13 +8,16 @@ import org.elasticsearch.action.admin.indices.alias.Alias; import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.common.settings.SecureString; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.test.SecuritySettingsSourceField; import org.elasticsearch.xpack.core.XPackSettings; import org.elasticsearch.test.SecurityIntegTestCase; import java.util.Collections; +import java.util.Map; import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.IMMEDIATE; import static org.elasticsearch.xpack.core.security.authc.support.UsernamePasswordToken.BASIC_AUTH_HEADER; @@ -67,7 +70,7 @@ public Settings nodeSettings(int nodeOrdinal, Settings otherSettings) { .build(); } - public void testResolveWildcardsRegexs() throws Exception { + public void testGetResolveWildcardsRegexs() throws Exception { assertAcked(client().admin().indices().prepareCreate("test") .setMapping("field1", "type=text", "field2", "type=text") .addAlias(new Alias("my_alias")) @@ -99,4 +102,68 @@ public void testResolveWildcardsRegexs() throws Exception { assertThat((String) getResponse.getSource().get("field3"), equalTo("value3")); } + public void testSearchResolveWildcardsRegexs() throws Exception { + assertAcked(client().admin().indices().prepareCreate("test") + .setMapping("field1", "type=text", "field2", "type=text") + .addAlias(new Alias("my_alias")) + .addAlias(new Alias("an_alias")) + ); + client().prepareIndex("test").setId("1").setSource("field1", "value1", "field2", "value2", "field3", "value3") + .setRefreshPolicy(IMMEDIATE) + .get(); + + SearchResponse response = client() + .filterWithHeader(Collections.singletonMap(BASIC_AUTH_HEADER, basicAuthHeaderValue("user1", USERS_PASSWD))) + .prepareSearch("test") + .setQuery(QueryBuilders.termQuery("_id", "1")) + .get(); + assertThat(response.getHits().getHits().length, equalTo(1)); + Map source = response.getHits().getHits()[0].getSourceAsMap(); + assertThat(source.size(), equalTo(1)); + assertThat((String) source.get("field1"), equalTo("value1")); + + response = client() + .filterWithHeader(Collections.singletonMap(BASIC_AUTH_HEADER, basicAuthHeaderValue("user1", USERS_PASSWD))) + .prepareSearch("my_alias") + .setQuery(QueryBuilders.termQuery("_id", "1")) + .get(); + assertThat(response.getHits().getHits().length, equalTo(1)); + source = response.getHits().getHits()[0].getSourceAsMap(); + assertThat(source.size(), equalTo(1)); + assertThat((String) source.get("field2"), equalTo("value2")); + + + response = client() + .filterWithHeader(Collections.singletonMap(BASIC_AUTH_HEADER, basicAuthHeaderValue("user1", USERS_PASSWD))) + .prepareSearch("an_alias") + .setQuery(QueryBuilders.termQuery("_id", "1")) + .get(); + assertThat(response.getHits().getHits().length, equalTo(1)); + source = response.getHits().getHits()[0].getSourceAsMap(); + assertThat(source.size(), equalTo(1)); + assertThat((String) source.get("field3"), equalTo("value3")); + + response = client() + .filterWithHeader(Collections.singletonMap(BASIC_AUTH_HEADER, basicAuthHeaderValue("user1", USERS_PASSWD))) + .prepareSearch("*_alias") + .setQuery(QueryBuilders.termQuery("_id", "1")) + .get(); + assertThat(response.getHits().getHits().length, equalTo(1)); + source = response.getHits().getHits()[0].getSourceAsMap(); + assertThat(source.size(), equalTo(2)); + assertThat((String) source.get("field2"), equalTo("value2")); + assertThat((String) source.get("field3"), equalTo("value3")); + + response = client() + .filterWithHeader(Collections.singletonMap(BASIC_AUTH_HEADER, basicAuthHeaderValue("user1", USERS_PASSWD))) + .prepareSearch("*_alias", "t*") + .setQuery(QueryBuilders.termQuery("_id", "1")) + .get(); + assertThat(response.getHits().getHits().length, equalTo(1)); + source = response.getHits().getHits()[0].getSourceAsMap(); + assertThat(source.size(), equalTo(3)); + assertThat((String) source.get("field1"), equalTo("value1")); + assertThat((String) source.get("field2"), equalTo("value2")); + assertThat((String) source.get("field3"), equalTo("value3")); + } } From 1770a1244b4a97ef991259fe357db146dbdf4825 Mon Sep 17 00:00:00 2001 From: jimczi Date: Mon, 4 Oct 2021 13:51:06 +0200 Subject: [PATCH 12/18] checkstyl --- .../org/elasticsearch/action/search/TransportSearchAction.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index 413a6ce29ef70..114cb91258a4f 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -8,7 +8,6 @@ package org.elasticsearch.action.search; -import org.apache.lucene.index.IndexOptions; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.admin.cluster.shards.ClusterSearchShardsGroup; From 57a09bf69562f6a22333b0831b2256b135ea9901 Mon Sep 17 00:00:00 2001 From: jimczi Date: Mon, 4 Oct 2021 14:07:53 +0200 Subject: [PATCH 13/18] fix NPE --- .../org/elasticsearch/action/search/TransportSearchAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index 114cb91258a4f..78ef4ec79fb07 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -682,7 +682,7 @@ private void executeSearch(SearchTask task, SearchTimeProvider timeProvider, Sea final Set indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, searchRequest.indices()); aliasFilter = buildPerIndexAliasFilter(clusterState, indicesAndAliases, indices, remoteAliasMap); final Map finalIndicesMap = - buildPerIndexOriginalIndices(clusterState, indicesAndAliases, indices, localIndices.indicesOptions()); + buildPerIndexOriginalIndices(clusterState, indicesAndAliases, indices, searchRequest.indicesOptions()); localShardIterators = StreamSupport.stream(localShardRoutings.spliterator(), false) .map(it -> { OriginalIndices finalIndices = finalIndicesMap.get(it.shardId().getIndex().getUUID()); From b988ed5476550c8a6361ae5be1700feaf70f9832 Mon Sep 17 00:00:00 2001 From: jimczi Date: Tue, 12 Oct 2021 12:25:59 +0200 Subject: [PATCH 14/18] add datastream name in the original indices when needed --- .../action/search/TransportSearchAction.java | 17 ++- x-pack/plugin/security/build.gradle | 1 + ...onsWithAliasesWildcardsAndRegexsTests.java | 126 ++++++++++++++++++ 3 files changed, 142 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index 3aacbf5fca430..9a5d1c64241d2 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -20,6 +20,8 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.block.ClusterBlockLevel; +import org.elasticsearch.cluster.metadata.IndexAbstraction; +import org.elasticsearch.cluster.metadata.IndexAbstraction.DataStream; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.node.DiscoveryNode; @@ -140,6 +142,11 @@ public TransportSearchAction(ThreadPool threadPool, this.executorSelector = executorSelector; } + private DataStream getParentDataStreamOrNull(ClusterState clusterState, Index index) { + IndexAbstraction ret = clusterState.getMetadata().getIndicesLookup().get(index.getName()); + return ret != null ? ret.getParentDataStream() : null; + } + private Map buildPerIndexOriginalIndices(ClusterState clusterState, Set indicesAndAliases, Index[] concreteIndices, @@ -147,16 +154,22 @@ private Map buildPerIndexOriginalIndices(ClusterState c Map res = new HashMap<>(); for (Index index : concreteIndices) { clusterState.blocks().indexBlockedRaiseException(ClusterBlockLevel.READ, index.getName()); + DataStream parentDataStream = getParentDataStreamOrNull(clusterState, index); String[] aliases = indexNameExpressionResolver.indexAliases(clusterState, index.getName(), aliasMetadata -> true, dataStreamAlias -> true, true, indicesAndAliases); + List finalIndices = new ArrayList<>(); - if (indicesAndAliases.contains(index.getName()) - || aliases == null || aliases.length == 0) { + if (parentDataStream != null + && indicesAndAliases.contains(parentDataStream.getName())) { + finalIndices.add(parentDataStream.getName()); + } + if (indicesAndAliases.contains(index.getName())) { finalIndices.add(index.getName()); } if (aliases != null) { finalIndices.addAll(Arrays.asList(aliases)); } + assert finalIndices.isEmpty() == false : "unable to resolve original indices"; res.put(index.getUUID(), new OriginalIndices(finalIndices.toArray(String[]::new), indicesOptions)); } return Collections.unmodifiableMap(res); diff --git a/x-pack/plugin/security/build.gradle b/x-pack/plugin/security/build.gradle index 6893988c109df..0c80173a720f7 100644 --- a/x-pack/plugin/security/build.gradle +++ b/x-pack/plugin/security/build.gradle @@ -25,6 +25,7 @@ dependencies { testImplementation project(path: xpackModule('sql:sql-action')) testImplementation project(path: ':modules:analysis-common') testImplementation project(path: ':modules:reindex') + testImplementation project(path: xpackModule('data-streams')) testImplementation project(":client:rest-high-level") testImplementation(testArtifact(project(xpackModule('core')))) diff --git a/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/IndicesPermissionsWithAliasesWildcardsAndRegexsTests.java b/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/IndicesPermissionsWithAliasesWildcardsAndRegexsTests.java index cc1e96f6d8f77..91210395c38af 100644 --- a/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/IndicesPermissionsWithAliasesWildcardsAndRegexsTests.java +++ b/x-pack/plugin/security/src/internalClusterTest/java/org/elasticsearch/integration/IndicesPermissionsWithAliasesWildcardsAndRegexsTests.java @@ -7,19 +7,35 @@ package org.elasticsearch.integration; import org.elasticsearch.action.admin.indices.alias.Alias; +import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest; +import org.elasticsearch.action.admin.indices.template.delete.DeleteComposableIndexTemplateAction; +import org.elasticsearch.action.admin.indices.template.put.PutComposableIndexTemplateAction; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.support.master.AcknowledgedResponse; +import org.elasticsearch.cluster.metadata.ComposableIndexTemplate; +import org.elasticsearch.cluster.metadata.Template; import org.elasticsearch.common.settings.SecureString; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.mapper.DateFieldMapper; import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.SecuritySettingsSourceField; import org.elasticsearch.xpack.core.XPackSettings; import org.elasticsearch.test.SecurityIntegTestCase; +import org.elasticsearch.xpack.core.action.CreateDataStreamAction; +import org.elasticsearch.xpack.core.action.DeleteDataStreamAction; +import org.elasticsearch.xpack.datastreams.DataStreamsPlugin; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.Map; import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.IMMEDIATE; +import static org.elasticsearch.cluster.metadata.MetadataIndexTemplateService.DEFAULT_TIMESTAMP_FIELD; import static org.elasticsearch.xpack.core.security.authc.support.UsernamePasswordToken.BASIC_AUTH_HEADER; import static org.elasticsearch.xpack.core.security.authc.support.UsernamePasswordToken.basicAuthHeaderValue; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; @@ -70,6 +86,13 @@ public Settings nodeSettings(int nodeOrdinal, Settings otherSettings) { .build(); } + @Override + protected Collection> nodePlugins() { + List> lst = new ArrayList<>(super.nodePlugins()); + lst.add(DataStreamsPlugin.class); + return lst; + } + public void testGetResolveWildcardsRegexs() throws Exception { assertAcked(client().admin().indices().prepareCreate("test") .setMapping("field1", "type=text", "field2", "type=text") @@ -166,4 +189,107 @@ public void testSearchResolveWildcardsRegexs() throws Exception { assertThat((String) source.get("field2"), equalTo("value2")); assertThat((String) source.get("field3"), equalTo("value3")); } + + public void testSearchResolveDataStreams() throws Exception { + putComposableIndexTemplate("id1", List.of("test*")); + CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request("test"); + client().execute(CreateDataStreamAction.INSTANCE, createDataStreamRequest).get(); + + IndicesAliasesRequest aliasesRequest = new IndicesAliasesRequest(); + aliasesRequest.addAliasAction(new IndicesAliasesRequest.AliasActions(IndicesAliasesRequest.AliasActions.Type.ADD) + .aliases("my_alias", "an_alias") + .index("test")); + assertAcked(client().admin().indices().aliases(aliasesRequest).actionGet()); + + try { + String value = DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER.formatMillis(System.currentTimeMillis()); + client().prepareIndex("test") + .setCreate(true) + .setId("1") + .setSource(DEFAULT_TIMESTAMP_FIELD, value, "field1", "value1", "field2", "value2", "field3", "value3") + .setRefreshPolicy(IMMEDIATE) + .get(); + + SearchResponse response = client() + .filterWithHeader(Collections.singletonMap(BASIC_AUTH_HEADER, basicAuthHeaderValue("user1", USERS_PASSWD))) + .prepareSearch("test") + .setQuery(QueryBuilders.termQuery("_id", "1")) + .get(); + assertThat(response.getHits().getHits().length, equalTo(1)); + Map source = response.getHits().getHits()[0].getSourceAsMap(); + assertThat(source.size(), equalTo(1)); + assertThat((String) source.get("field1"), equalTo("value1")); + + response = client() + .filterWithHeader(Collections.singletonMap(BASIC_AUTH_HEADER, basicAuthHeaderValue("user1", USERS_PASSWD))) + .prepareSearch("my_alias") + .setQuery(QueryBuilders.termQuery("_id", "1")) + .get(); + assertThat(response.getHits().getHits().length, equalTo(1)); + source = response.getHits().getHits()[0].getSourceAsMap(); + assertThat(source.size(), equalTo(1)); + assertThat((String) source.get("field2"), equalTo("value2")); + + response = client() + .filterWithHeader(Collections.singletonMap(BASIC_AUTH_HEADER, basicAuthHeaderValue("user1", USERS_PASSWD))) + .prepareSearch("an_alias") + .setQuery(QueryBuilders.termQuery("_id", "1")) + .get(); + assertThat(response.getHits().getHits().length, equalTo(1)); + source = response.getHits().getHits()[0].getSourceAsMap(); + assertThat(source.size(), equalTo(1)); + assertThat((String) source.get("field3"), equalTo("value3")); + + response = client() + .filterWithHeader(Collections.singletonMap(BASIC_AUTH_HEADER, basicAuthHeaderValue("user1", USERS_PASSWD))) + .prepareSearch("*_alias") + .setQuery(QueryBuilders.termQuery("_id", "1")) + .get(); + assertThat(response.getHits().getHits().length, equalTo(1)); + source = response.getHits().getHits()[0].getSourceAsMap(); + assertThat(source.size(), equalTo(2)); + assertThat((String) source.get("field2"), equalTo("value2")); + assertThat((String) source.get("field3"), equalTo("value3")); + + response = client() + .filterWithHeader(Collections.singletonMap(BASIC_AUTH_HEADER, basicAuthHeaderValue("user1", USERS_PASSWD))) + .prepareSearch("*_alias", "t*") + .setQuery(QueryBuilders.termQuery("_id", "1")) + .get(); + assertThat(response.getHits().getHits().length, equalTo(1)); + source = response.getHits().getHits()[0].getSourceAsMap(); + assertThat(source.size(), equalTo(3)); + assertThat((String) source.get("field1"), equalTo("value1")); + assertThat((String) source.get("field2"), equalTo("value2")); + assertThat((String) source.get("field3"), equalTo("value3")); + } finally { + AcknowledgedResponse response = client().execute( + DeleteDataStreamAction.INSTANCE, + new DeleteDataStreamAction.Request(new String[]{"*"}) + ).actionGet(); + assertAcked(response); + + DeleteDataStreamAction.Request deleteDSRequest = new DeleteDataStreamAction.Request(new String[]{"*"}); + client().execute(DeleteDataStreamAction.INSTANCE, deleteDSRequest).actionGet(); + DeleteComposableIndexTemplateAction.Request deleteTemplateRequest = new DeleteComposableIndexTemplateAction.Request("*"); + client().execute(DeleteComposableIndexTemplateAction.INSTANCE, deleteTemplateRequest).actionGet(); + } + } + + private void putComposableIndexTemplate(String id, List patterns) throws IOException { + PutComposableIndexTemplateAction.Request request = new PutComposableIndexTemplateAction.Request(id); + request.indexTemplate( + new ComposableIndexTemplate( + patterns, + new Template(null, null, null), + null, + null, + null, + null, + new ComposableIndexTemplate.DataStreamTemplate(), + null + ) + ); + client().execute(PutComposableIndexTemplateAction.INSTANCE, request).actionGet(); + } } From 1ad8a7baada99ebdc74a2478003e0e707f778e54 Mon Sep 17 00:00:00 2001 From: jimczi Date: Tue, 12 Oct 2021 12:40:12 +0200 Subject: [PATCH 15/18] add the index name, not the datastream name --- .../action/search/TransportSearchAction.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index 9a5d1c64241d2..b75588ad5e133 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -22,7 +22,6 @@ import org.elasticsearch.cluster.block.ClusterBlockLevel; import org.elasticsearch.cluster.metadata.IndexAbstraction; import org.elasticsearch.cluster.metadata.IndexAbstraction.DataStream; -import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodes; @@ -157,19 +156,17 @@ private Map buildPerIndexOriginalIndices(ClusterState c DataStream parentDataStream = getParentDataStreamOrNull(clusterState, index); String[] aliases = indexNameExpressionResolver.indexAliases(clusterState, index.getName(), aliasMetadata -> true, dataStreamAlias -> true, true, indicesAndAliases); - List finalIndices = new ArrayList<>(); - if (parentDataStream != null - && indicesAndAliases.contains(parentDataStream.getName())) { - finalIndices.add(parentDataStream.getName()); - } - if (indicesAndAliases.contains(index.getName())) { + if (aliases == null + || aliases.length == 0 + || indicesAndAliases.contains(index.getName()) + || (parentDataStream != null + && indicesAndAliases.contains(parentDataStream.getName()))) { finalIndices.add(index.getName()); } if (aliases != null) { finalIndices.addAll(Arrays.asList(aliases)); } - assert finalIndices.isEmpty() == false : "unable to resolve original indices"; res.put(index.getUUID(), new OriginalIndices(finalIndices.toArray(String[]::new), indicesOptions)); } return Collections.unmodifiableMap(res); From 486a0fb10de70979cfa45b74600efa039fca5ee6 Mon Sep 17 00:00:00 2001 From: jimczi Date: Tue, 12 Oct 2021 12:41:46 +0200 Subject: [PATCH 16/18] fix compil --- .../org/elasticsearch/action/search/TransportSearchAction.java | 1 + 1 file changed, 1 insertion(+) diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index b75588ad5e133..e5497811c03e3 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -22,6 +22,7 @@ import org.elasticsearch.cluster.block.ClusterBlockLevel; import org.elasticsearch.cluster.metadata.IndexAbstraction; import org.elasticsearch.cluster.metadata.IndexAbstraction.DataStream; +import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodes; From ed102d5f206a1430796f94533ed4cb6414896cd4 Mon Sep 17 00:00:00 2001 From: jimczi Date: Tue, 12 Oct 2021 13:30:39 +0200 Subject: [PATCH 17/18] avoid index lookups when there is no alias --- .../action/search/TransportSearchAction.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index e5497811c03e3..68ae283981b57 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -84,6 +84,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import java.util.function.BooleanSupplier; import java.util.function.Function; import java.util.function.LongSupplier; import java.util.stream.Collectors; @@ -142,11 +143,6 @@ public TransportSearchAction(ThreadPool threadPool, this.executorSelector = executorSelector; } - private DataStream getParentDataStreamOrNull(ClusterState clusterState, Index index) { - IndexAbstraction ret = clusterState.getMetadata().getIndicesLookup().get(index.getName()); - return ret != null ? ret.getParentDataStream() : null; - } - private Map buildPerIndexOriginalIndices(ClusterState clusterState, Set indicesAndAliases, Index[] concreteIndices, @@ -154,15 +150,21 @@ private Map buildPerIndexOriginalIndices(ClusterState c Map res = new HashMap<>(); for (Index index : concreteIndices) { clusterState.blocks().indexBlockedRaiseException(ClusterBlockLevel.READ, index.getName()); - DataStream parentDataStream = getParentDataStreamOrNull(clusterState, index); + String[] aliases = indexNameExpressionResolver.indexAliases(clusterState, index.getName(), aliasMetadata -> true, dataStreamAlias -> true, true, indicesAndAliases); + BooleanSupplier hasDataStreamRef = () -> { + IndexAbstraction ret = clusterState.getMetadata().getIndicesLookup().get(index.getName()); + if (ret == null || ret.getParentDataStream() == null) { + return false; + } + return indicesAndAliases.contains(ret.getParentDataStream().getName()); + }; List finalIndices = new ArrayList<>(); if (aliases == null || aliases.length == 0 || indicesAndAliases.contains(index.getName()) - || (parentDataStream != null - && indicesAndAliases.contains(parentDataStream.getName()))) { + || hasDataStreamRef.getAsBoolean()) { finalIndices.add(index.getName()); } if (aliases != null) { From 858cb88cd49b8eafa3559dceeb0f9298e4d2e98e Mon Sep 17 00:00:00 2001 From: jimczi Date: Tue, 12 Oct 2021 13:41:35 +0200 Subject: [PATCH 18/18] unused import --- .../org/elasticsearch/action/search/TransportSearchAction.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java index 68ae283981b57..5d77c68941aef 100644 --- a/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java +++ b/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java @@ -21,7 +21,6 @@ import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.block.ClusterBlockLevel; import org.elasticsearch.cluster.metadata.IndexAbstraction; -import org.elasticsearch.cluster.metadata.IndexAbstraction.DataStream; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.node.DiscoveryNode;