Skip to content

Commit c27b89e

Browse files
Speedup resolving index aliases in TransportSearchAction (and in general)
Very often there are no aliases, no need to create a bunch of objects in this case. Also, no need to build an intermediary candidate list either. Plus the nested streams do get very costly when running this logic over a large number of indices.
1 parent aea2757 commit c27b89e

File tree

1 file changed

+23
-27
lines changed

1 file changed

+23
-27
lines changed

server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java

+23-27
Original file line numberDiff line numberDiff line change
@@ -1149,39 +1149,35 @@ public String[] indexAliases(
11491149
return requiredAliases.toArray(Strings.EMPTY_ARRAY);
11501150
} else {
11511151
final Map<String, AliasMetadata> indexAliases = indexMetadata.getAliases();
1152-
final AliasMetadata[] aliasCandidates;
1153-
if (iterateIndexAliases(indexAliases.size(), resolvedExpressions.size())) {
1152+
final int aliasCount = indexAliases.size();
1153+
if (aliasCount == 0) {
1154+
return null;
1155+
}
1156+
final List<String> aliases = new ArrayList<>(aliasCount);
1157+
if (iterateIndexAliases(aliasCount, resolvedExpressions.size())) {
11541158
// faster to iterate indexAliases
1155-
aliasCandidates = indexAliases.values()
1156-
.stream()
1157-
// Indices can only be referenced with a data selector, or a null selector if selectors are disabled
1158-
.filter(aliasMetadata -> resolvedExpressionsContainsAbstraction(resolvedExpressions, aliasMetadata.alias()))
1159-
.toArray(AliasMetadata[]::new);
1159+
// Indices can only be referenced with a data selector, or a null selector if selectors are disabled
1160+
for (AliasMetadata aliasMetadata : indexAliases.values()) {
1161+
var alias = aliasMetadata.alias();
1162+
if (resolvedExpressionsContainsAbstraction(resolvedExpressions, alias)) {
1163+
if (requiredAlias.test(aliasMetadata) == false) {
1164+
return null;
1165+
}
1166+
aliases.add(alias);
1167+
}
1168+
}
11601169
} else {
11611170
// faster to iterate resolvedExpressions
1162-
aliasCandidates = resolvedExpressions.stream()
1163-
.map(ResolvedExpression::resource)
1164-
.map(indexAliases::get)
1165-
.filter(Objects::nonNull)
1166-
.toArray(AliasMetadata[]::new);
1167-
}
1168-
List<String> aliases = null;
1169-
for (int i = 0; i < aliasCandidates.length; i++) {
1170-
AliasMetadata aliasMetadata = aliasCandidates[i];
1171-
if (requiredAlias.test(aliasMetadata)) {
1172-
// If required - add it to the list of aliases
1173-
if (aliases == null) {
1174-
aliases = new ArrayList<>();
1171+
for (ResolvedExpression resolvedExpression : resolvedExpressions) {
1172+
AliasMetadata aliasMetadata = indexAliases.get(resolvedExpression.resource());
1173+
if (aliasMetadata != null) {
1174+
if (requiredAlias.test(aliasMetadata) == false) {
1175+
return null;
1176+
}
1177+
aliases.add(aliasMetadata.getAlias());
11751178
}
1176-
aliases.add(aliasMetadata.alias());
1177-
} else {
1178-
// If not, we have a non required alias for this index - no further checking needed
1179-
return null;
11801179
}
11811180
}
1182-
if (aliases == null) {
1183-
return null;
1184-
}
11851181
return aliases.toArray(Strings.EMPTY_ARRAY);
11861182
}
11871183
}

0 commit comments

Comments
 (0)