Skip to content

Commit d151b3c

Browse files
authored
Re-add ResolvedExpression wrapper (#118174) (#118365)
This PR reapplies #114592 along with an update to remove the performance regression introduced with the original change. (cherry picked from commit 34b7e60)
1 parent 04d01fe commit d151b3c

File tree

13 files changed

+305
-164
lines changed

13 files changed

+305
-164
lines changed

server/src/main/java/org/elasticsearch/action/admin/cluster/shards/TransportClusterSearchShardsAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.elasticsearch.cluster.block.ClusterBlockException;
1818
import org.elasticsearch.cluster.block.ClusterBlockLevel;
1919
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
20+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
2021
import org.elasticsearch.cluster.node.DiscoveryNode;
2122
import org.elasticsearch.cluster.routing.GroupShardsIterator;
2223
import org.elasticsearch.cluster.routing.ShardIterator;
@@ -84,7 +85,7 @@ protected void masterOperation(
8485
String[] concreteIndices = indexNameExpressionResolver.concreteIndexNames(clusterState, request);
8586
Map<String, Set<String>> routingMap = indexNameExpressionResolver.resolveSearchRouting(state, request.routing(), request.indices());
8687
Map<String, AliasFilter> indicesAndFilters = new HashMap<>();
87-
Set<String> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices());
88+
Set<ResolvedExpression> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices());
8889
for (String index : concreteIndices) {
8990
final AliasFilter aliasFilter = indicesService.buildAliasFilter(clusterState, index, indicesAndAliases);
9091
final String[] aliases = indexNameExpressionResolver.indexAliases(

server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.elasticsearch.cluster.metadata.IndexAbstraction;
2626
import org.elasticsearch.cluster.metadata.IndexMetadata;
2727
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
28+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
2829
import org.elasticsearch.cluster.metadata.Metadata;
2930
import org.elasticsearch.cluster.service.ClusterService;
3031
import org.elasticsearch.common.Strings;
@@ -565,8 +566,8 @@ static void resolveIndices(
565566
if (names.length == 1 && (Metadata.ALL.equals(names[0]) || Regex.isMatchAllPattern(names[0]))) {
566567
names = new String[] { "**" };
567568
}
568-
Set<String> resolvedIndexAbstractions = resolver.resolveExpressions(clusterState, indicesOptions, true, names);
569-
for (String s : resolvedIndexAbstractions) {
569+
Set<ResolvedExpression> resolvedIndexAbstractions = resolver.resolveExpressions(clusterState, indicesOptions, true, names);
570+
for (ResolvedExpression s : resolvedIndexAbstractions) {
570571
enrichIndexAbstraction(clusterState, s, indices, aliases, dataStreams);
571572
}
572573
indices.sort(Comparator.comparing(ResolvedIndexAbstraction::getName));
@@ -597,12 +598,12 @@ private static void mergeResults(
597598

598599
private static void enrichIndexAbstraction(
599600
ClusterState clusterState,
600-
String indexAbstraction,
601+
ResolvedExpression indexAbstraction,
601602
List<ResolvedIndex> indices,
602603
List<ResolvedAlias> aliases,
603604
List<ResolvedDataStream> dataStreams
604605
) {
605-
IndexAbstraction ia = clusterState.metadata().getIndicesLookup().get(indexAbstraction);
606+
IndexAbstraction ia = clusterState.metadata().getIndicesLookup().get(indexAbstraction.resource());
606607
if (ia != null) {
607608
switch (ia.getType()) {
608609
case CONCRETE_INDEX -> {

server/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.elasticsearch.cluster.block.ClusterBlockException;
2222
import org.elasticsearch.cluster.block.ClusterBlockLevel;
2323
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
24+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
2425
import org.elasticsearch.cluster.routing.GroupShardsIterator;
2526
import org.elasticsearch.cluster.routing.ShardIterator;
2627
import org.elasticsearch.cluster.routing.ShardRouting;
@@ -133,7 +134,7 @@ protected void doExecute(Task task, ValidateQueryRequest request, ActionListener
133134
@Override
134135
protected ShardValidateQueryRequest newShardRequest(int numShards, ShardRouting shard, ValidateQueryRequest request) {
135136
final ClusterState clusterState = clusterService.state();
136-
final Set<String> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices());
137+
final Set<ResolvedExpression> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, request.indices());
137138
final AliasFilter aliasFilter = searchService.buildAliasFilter(clusterState, shard.getIndexName(), indicesAndAliases);
138139
return new ShardValidateQueryRequest(shard.shardId(), aliasFilter, request);
139140
}

server/src/main/java/org/elasticsearch/action/explain/TransportExplainAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.elasticsearch.action.support.single.shard.TransportSingleShardAction;
1919
import org.elasticsearch.cluster.ClusterState;
2020
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
21+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
2122
import org.elasticsearch.cluster.routing.ShardIterator;
2223
import org.elasticsearch.cluster.service.ClusterService;
2324
import org.elasticsearch.common.io.stream.Writeable;
@@ -109,7 +110,7 @@ protected boolean resolveIndex(ExplainRequest request) {
109110

110111
@Override
111112
protected void resolveRequest(ClusterState state, InternalRequest request) {
112-
final Set<String> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(state, request.request().index());
113+
final Set<ResolvedExpression> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(state, request.request().index());
113114
final AliasFilter aliasFilter = searchService.buildAliasFilter(state, request.concreteIndex(), indicesAndAliases);
114115
request.request().filteringAlias(aliasFilter);
115116
}

server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.elasticsearch.cluster.metadata.IndexAbstraction;
3838
import org.elasticsearch.cluster.metadata.IndexMetadata;
3939
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
40+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
4041
import org.elasticsearch.cluster.node.DiscoveryNode;
4142
import org.elasticsearch.cluster.node.DiscoveryNodes;
4243
import org.elasticsearch.cluster.routing.GroupShardsIterator;
@@ -110,6 +111,7 @@
110111
import java.util.function.BiFunction;
111112
import java.util.function.Function;
112113
import java.util.function.LongSupplier;
114+
import java.util.stream.Collectors;
113115

114116
import static org.elasticsearch.action.search.SearchType.DFS_QUERY_THEN_FETCH;
115117
import static org.elasticsearch.action.search.SearchType.QUERY_THEN_FETCH;
@@ -202,14 +204,17 @@ public TransportSearchAction(
202204

203205
private Map<String, OriginalIndices> buildPerIndexOriginalIndices(
204206
ClusterState clusterState,
205-
Set<String> indicesAndAliases,
207+
Set<ResolvedExpression> indicesAndAliases,
206208
String[] indices,
207209
IndicesOptions indicesOptions
208210
) {
209211
Map<String, OriginalIndices> res = Maps.newMapWithExpectedSize(indices.length);
210212
var blocks = clusterState.blocks();
211213
// optimization: mostly we do not have any blocks so there's no point in the expensive per-index checking
212214
boolean hasBlocks = blocks.global().isEmpty() == false || blocks.indices().isEmpty() == false;
215+
// Get a distinct set of index abstraction names present from the resolved expressions to help with the reverse resolution from
216+
// concrete index to the expression that produced it.
217+
Set<String> indicesAndAliasesResources = indicesAndAliases.stream().map(ResolvedExpression::resource).collect(Collectors.toSet());
213218
for (String index : indices) {
214219
if (hasBlocks) {
215220
blocks.indexBlockedRaiseException(ClusterBlockLevel.READ, index);
@@ -226,8 +231,8 @@ private Map<String, OriginalIndices> buildPerIndexOriginalIndices(
226231
String[] finalIndices = Strings.EMPTY_ARRAY;
227232
if (aliases == null
228233
|| aliases.length == 0
229-
|| indicesAndAliases.contains(index)
230-
|| hasDataStreamRef(clusterState, indicesAndAliases, index)) {
234+
|| indicesAndAliasesResources.contains(index)
235+
|| hasDataStreamRef(clusterState, indicesAndAliasesResources, index)) {
231236
finalIndices = new String[] { index };
232237
}
233238
if (aliases != null) {
@@ -246,7 +251,11 @@ private static boolean hasDataStreamRef(ClusterState clusterState, Set<String> i
246251
return indicesAndAliases.contains(ret.getParentDataStream().getName());
247252
}
248253

249-
Map<String, AliasFilter> buildIndexAliasFilters(ClusterState clusterState, Set<String> indicesAndAliases, Index[] concreteIndices) {
254+
Map<String, AliasFilter> buildIndexAliasFilters(
255+
ClusterState clusterState,
256+
Set<ResolvedExpression> indicesAndAliases,
257+
Index[] concreteIndices
258+
) {
250259
final Map<String, AliasFilter> aliasFilterMap = new HashMap<>();
251260
for (Index index : concreteIndices) {
252261
clusterState.blocks().indexBlockedRaiseException(ClusterBlockLevel.READ, index.getName());
@@ -1236,7 +1245,10 @@ private void executeSearch(
12361245
} else {
12371246
final Index[] indices = resolvedIndices.getConcreteLocalIndices();
12381247
concreteLocalIndices = Arrays.stream(indices).map(Index::getName).toArray(String[]::new);
1239-
final Set<String> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, searchRequest.indices());
1248+
final Set<ResolvedExpression> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(
1249+
clusterState,
1250+
searchRequest.indices()
1251+
);
12401252
aliasFilter = buildIndexAliasFilters(clusterState, indicesAndAliases, indices);
12411253
aliasFilter.putAll(remoteAliasMap);
12421254
localShardIterators = getLocalShardsIterator(
@@ -1834,7 +1846,7 @@ List<SearchShardIterator> getLocalShardsIterator(
18341846
ClusterState clusterState,
18351847
SearchRequest searchRequest,
18361848
String clusterAlias,
1837-
Set<String> indicesAndAliases,
1849+
Set<ResolvedExpression> indicesAndAliases,
18381850
String[] concreteIndices
18391851
) {
18401852
var routingMap = indexNameExpressionResolver.resolveSearchRouting(clusterState, searchRequest.routing(), searchRequest.indices());

server/src/main/java/org/elasticsearch/action/search/TransportSearchShardsAction.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.elasticsearch.action.support.HandledTransportAction;
1818
import org.elasticsearch.cluster.ClusterState;
1919
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
20+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
2021
import org.elasticsearch.cluster.routing.GroupShardsIterator;
2122
import org.elasticsearch.cluster.service.ClusterService;
2223
import org.elasticsearch.index.Index;
@@ -127,7 +128,10 @@ public void searchShards(Task task, SearchShardsRequest searchShardsRequest, Act
127128
searchService.getRewriteContext(timeProvider::absoluteStartMillis, resolvedIndices, null),
128129
listener.delegateFailureAndWrap((delegate, searchRequest) -> {
129130
Index[] concreteIndices = resolvedIndices.getConcreteLocalIndices();
130-
final Set<String> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(clusterState, searchRequest.indices());
131+
final Set<ResolvedExpression> indicesAndAliases = indexNameExpressionResolver.resolveExpressions(
132+
clusterState,
133+
searchRequest.indices()
134+
);
131135
final Map<String, AliasFilter> aliasFilters = transportSearchAction.buildIndexAliasFilters(
132136
clusterState,
133137
indicesAndAliases,

0 commit comments

Comments
 (0)