Skip to content

Commit 34b7e60

Browse files
authored
Re-add ResolvedExpression wrapper (#118174)
This PR reapplies #114592 along with an update to remove the performance regression introduced with the original change.
1 parent 78620c6 commit 34b7e60

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
@@ -38,6 +38,7 @@
3838
import org.elasticsearch.cluster.metadata.IndexAbstraction;
3939
import org.elasticsearch.cluster.metadata.IndexMetadata;
4040
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
41+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.ResolvedExpression;
4142
import org.elasticsearch.cluster.node.DiscoveryNode;
4243
import org.elasticsearch.cluster.node.DiscoveryNodes;
4344
import org.elasticsearch.cluster.routing.GroupShardsIterator;
@@ -111,6 +112,7 @@
111112
import java.util.function.BiFunction;
112113
import java.util.function.Function;
113114
import java.util.function.LongSupplier;
115+
import java.util.stream.Collectors;
114116

115117
import static org.elasticsearch.action.search.SearchType.DFS_QUERY_THEN_FETCH;
116118
import static org.elasticsearch.action.search.SearchType.QUERY_THEN_FETCH;
@@ -207,14 +209,17 @@ public TransportSearchAction(
207209

208210
private Map<String, OriginalIndices> buildPerIndexOriginalIndices(
209211
ClusterState clusterState,
210-
Set<String> indicesAndAliases,
212+
Set<ResolvedExpression> indicesAndAliases,
211213
String[] indices,
212214
IndicesOptions indicesOptions
213215
) {
214216
Map<String, OriginalIndices> res = Maps.newMapWithExpectedSize(indices.length);
215217
var blocks = clusterState.blocks();
216218
// optimization: mostly we do not have any blocks so there's no point in the expensive per-index checking
217219
boolean hasBlocks = blocks.global().isEmpty() == false || blocks.indices().isEmpty() == false;
220+
// Get a distinct set of index abstraction names present from the resolved expressions to help with the reverse resolution from
221+
// concrete index to the expression that produced it.
222+
Set<String> indicesAndAliasesResources = indicesAndAliases.stream().map(ResolvedExpression::resource).collect(Collectors.toSet());
218223
for (String index : indices) {
219224
if (hasBlocks) {
220225
blocks.indexBlockedRaiseException(ClusterBlockLevel.READ, index);
@@ -231,8 +236,8 @@ private Map<String, OriginalIndices> buildPerIndexOriginalIndices(
231236
String[] finalIndices = Strings.EMPTY_ARRAY;
232237
if (aliases == null
233238
|| aliases.length == 0
234-
|| indicesAndAliases.contains(index)
235-
|| hasDataStreamRef(clusterState, indicesAndAliases, index)) {
239+
|| indicesAndAliasesResources.contains(index)
240+
|| hasDataStreamRef(clusterState, indicesAndAliasesResources, index)) {
236241
finalIndices = new String[] { index };
237242
}
238243
if (aliases != null) {
@@ -251,7 +256,11 @@ private static boolean hasDataStreamRef(ClusterState clusterState, Set<String> i
251256
return indicesAndAliases.contains(ret.getParentDataStream().getName());
252257
}
253258

254-
Map<String, AliasFilter> buildIndexAliasFilters(ClusterState clusterState, Set<String> indicesAndAliases, Index[] concreteIndices) {
259+
Map<String, AliasFilter> buildIndexAliasFilters(
260+
ClusterState clusterState,
261+
Set<ResolvedExpression> indicesAndAliases,
262+
Index[] concreteIndices
263+
) {
255264
final Map<String, AliasFilter> aliasFilterMap = new HashMap<>();
256265
for (Index index : concreteIndices) {
257266
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(
@@ -1835,7 +1847,7 @@ List<SearchShardIterator> getLocalShardsIterator(
18351847
ClusterState clusterState,
18361848
SearchRequest searchRequest,
18371849
String clusterAlias,
1838-
Set<String> indicesAndAliases,
1850+
Set<ResolvedExpression> indicesAndAliases,
18391851
String[] concreteIndices
18401852
) {
18411853
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)