Skip to content

Commit e8e068b

Browse files
Some obvious speedups to parsing alias filters (#127240)
It's in the title, saving some allocations and weird indirection in obvious spots.
1 parent d1225bc commit e8e068b

File tree

4 files changed

+52
-52
lines changed

4 files changed

+52
-52
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,11 +374,14 @@ protected static Collection<ResolvedExpression> resolveExpressionsToResources(Co
374374
return List.of();
375375
}
376376
} else {
377-
Predicate<String> isMatchAll = (((Predicate<String>) Metadata.ALL::equals)).or(Regex::isMatchAllPattern);
378377
if (expressions == null
379378
|| expressions.length == 0
380379
|| expressions.length == 1
381-
&& (SelectorResolver.selectorsValidatedAndMatchesPredicate(expressions[0], context, isMatchAll))) {
380+
&& (SelectorResolver.selectorsValidatedAndMatchesPredicate(
381+
expressions[0],
382+
context,
383+
s -> Metadata.ALL.equals(s) || Regex.isMatchAllPattern(s)
384+
))) {
382385
IndexComponentSelector selector;
383386
if (expressions != null && expressions.length == 1) {
384387
selector = SelectorResolver.parseMatchAllToSelector(context, expressions[0]);

server/src/main/java/org/elasticsearch/indices/IndicesService.java

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,12 @@ public IndicesQueryCache getIndicesQueryCache() {
10231023
return indicesQueryCache;
10241024
}
10251025

1026+
private QueryBuilder parseFilter(BytesReference bytes) throws IOException {
1027+
try (XContentParser parser = XContentHelper.createParser(parserConfig, bytes)) {
1028+
return parseTopLevelQuery(parser);
1029+
}
1030+
}
1031+
10261032
static class OldShardsStats implements IndexEventListener {
10271033

10281034
final SearchStats searchStats = new SearchStats();
@@ -1743,13 +1749,6 @@ interface IndexDeletionAllowedPredicate {
17431749
public AliasFilter buildAliasFilter(ProjectState project, String index, Set<ResolvedExpression> resolvedExpressions) {
17441750
/* Being static, parseAliasFilter doesn't have access to whatever guts it needs to parse a query. Instead of passing in a bunch
17451751
* of dependencies we pass in a function that can perform the parsing. */
1746-
CheckedFunction<BytesReference, QueryBuilder, IOException> filterParser = bytes -> {
1747-
try (
1748-
XContentParser parser = XContentHelper.createParserNotCompressed(parserConfig, bytes, XContentHelper.xContentType(bytes))
1749-
) {
1750-
return parseTopLevelQuery(parser);
1751-
}
1752-
};
17531752

17541753
final ProjectMetadata metadata = project.metadata();
17551754
String[] aliases = indexNameExpressionResolver.filteringAliases(metadata, index, resolvedExpressions);
@@ -1759,43 +1758,36 @@ public AliasFilter buildAliasFilter(ProjectState project, String index, Set<Reso
17591758

17601759
IndexAbstraction ia = metadata.getIndicesLookup().get(index);
17611760
DataStream dataStream = ia.getParentDataStream();
1761+
final QueryBuilder filter;
17621762
if (dataStream != null) {
1763+
var dsAliases = metadata.dataStreamAliases();
17631764
String dataStreamName = dataStream.getName();
1764-
List<QueryBuilder> filters = Arrays.stream(aliases)
1765-
.map(name -> metadata.dataStreamAliases().get(name))
1766-
.filter(dataStreamAlias -> dataStreamAlias.getFilter(dataStreamName) != null)
1767-
.map(dataStreamAlias -> {
1768-
try {
1769-
return filterParser.apply(dataStreamAlias.getFilter(dataStreamName).uncompressed());
1770-
} catch (IOException e) {
1771-
throw new UncheckedIOException(e);
1772-
}
1773-
})
1774-
.toList();
1765+
List<QueryBuilder> filters = Arrays.stream(aliases).map(key -> {
1766+
var f = dsAliases.get(key).getFilter(dataStreamName);
1767+
if (f == null) {
1768+
return null;
1769+
}
1770+
try {
1771+
return parseFilter(f.compressedReference());
1772+
} catch (IOException e) {
1773+
throw new UncheckedIOException(e);
1774+
}
1775+
}).filter(Objects::nonNull).toList();
17751776
if (filters.isEmpty()) {
1776-
return AliasFilter.of(null, aliases);
1777+
filter = null;
1778+
} else if (filters.size() == 1) {
1779+
filter = filters.getFirst();
17771780
} else {
1778-
if (filters.size() == 1) {
1779-
return AliasFilter.of(filters.get(0), aliases);
1780-
} else {
1781-
BoolQueryBuilder bool = new BoolQueryBuilder();
1782-
for (QueryBuilder filter : filters) {
1783-
bool.should(filter);
1784-
}
1785-
return AliasFilter.of(bool, aliases);
1781+
BoolQueryBuilder bool = new BoolQueryBuilder();
1782+
for (QueryBuilder f : filters) {
1783+
bool.should(f);
17861784
}
1785+
filter = bool;
17871786
}
17881787
} else {
1789-
IndexMetadata indexMetadata = metadata.index(index);
1790-
return AliasFilter.of(ShardSearchRequest.parseAliasFilter(filterParser, indexMetadata, aliases), aliases);
1788+
filter = ShardSearchRequest.parseAliasFilter(this::parseFilter, metadata.index(index), aliases);
17911789
}
1792-
}
1793-
1794-
/**
1795-
* Returns a new {@link QueryRewriteContext} with the given {@code now} provider
1796-
*/
1797-
public QueryRewriteContext getRewriteContext(LongSupplier nowInMillis, ResolvedIndices resolvedIndices, PointInTimeBuilder pit) {
1798-
return getRewriteContext(nowInMillis, resolvedIndices, pit, false);
1790+
return AliasFilter.of(filter, aliases);
17991791
}
18001792

18011793
/**

server/src/main/java/org/elasticsearch/search/internal/ShardSearchRequest.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
import java.util.Arrays;
5959
import java.util.List;
6060
import java.util.Map;
61-
import java.util.function.Function;
6261

6362
import static java.util.Collections.emptyMap;
6463
import static org.elasticsearch.search.internal.SearchContext.TRACK_TOTAL_HITS_DISABLED;
@@ -630,23 +629,13 @@ public static QueryBuilder parseAliasFilter(
630629
}
631630
Index index = metadata.getIndex();
632631
Map<String, AliasMetadata> aliases = metadata.getAliases();
633-
Function<AliasMetadata, QueryBuilder> parserFunction = (alias) -> {
634-
if (alias.filter() == null) {
635-
return null;
636-
}
637-
try {
638-
return filterParser.apply(alias.filter().uncompressed());
639-
} catch (IOException ex) {
640-
throw new AliasFilterParsingException(index, alias.getAlias(), "Invalid alias filter", ex);
641-
}
642-
};
643632
if (aliasNames.length == 1) {
644633
AliasMetadata alias = aliases.get(aliasNames[0]);
645634
if (alias == null) {
646635
// This shouldn't happen unless alias disappeared after filteringAliases was called.
647636
throw new InvalidAliasNameException(index, aliasNames[0], "Unknown alias name was passed to alias Filter");
648637
}
649-
return parserFunction.apply(alias);
638+
return parseAliasFilter(filterParser, alias, index);
650639
} else {
651640
// we need to bench here a bit, to see maybe it makes sense to use OrFilter
652641
BoolQueryBuilder combined = new BoolQueryBuilder();
@@ -656,7 +645,7 @@ public static QueryBuilder parseAliasFilter(
656645
// This shouldn't happen unless alias disappeared after filteringAliases was called.
657646
throw new InvalidAliasNameException(index, aliasNames[0], "Unknown alias name was passed to alias Filter");
658647
}
659-
QueryBuilder parsedFilter = parserFunction.apply(alias);
648+
QueryBuilder parsedFilter = parseAliasFilter(filterParser, alias, index);
660649
if (parsedFilter != null) {
661650
combined.should(parsedFilter);
662651
} else {
@@ -668,6 +657,21 @@ public static QueryBuilder parseAliasFilter(
668657
}
669658
}
670659

660+
private static QueryBuilder parseAliasFilter(
661+
CheckedFunction<BytesReference, QueryBuilder, IOException> filterParser,
662+
AliasMetadata alias,
663+
Index index
664+
) {
665+
if (alias.filter() == null) {
666+
return null;
667+
}
668+
try {
669+
return filterParser.apply(alias.filter().compressedReference());
670+
} catch (IOException ex) {
671+
throw new AliasFilterParsingException(index, alias.getAlias(), "Invalid alias filter", ex);
672+
}
673+
}
674+
671675
public final Map<String, Object> getRuntimeMappings() {
672676
return source == null ? emptyMap() : source.runtimeMappings();
673677
}

server/src/test/java/org/elasticsearch/search/internal/ShardSearchRequestTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.elasticsearch.common.Strings;
2020
import org.elasticsearch.common.UUIDs;
2121
import org.elasticsearch.common.compress.CompressedXContent;
22+
import org.elasticsearch.common.compress.CompressorFactory;
2223
import org.elasticsearch.common.io.stream.BytesStreamOutput;
2324
import org.elasticsearch.common.io.stream.StreamOutput;
2425
import org.elasticsearch.common.settings.Settings;
@@ -210,7 +211,7 @@ private IndexMetadata add(IndexMetadata indexMetadata, String alias, @Nullable C
210211
public QueryBuilder aliasFilter(IndexMetadata indexMetadata, String... aliasNames) {
211212
return ShardSearchRequest.parseAliasFilter(bytes -> {
212213
try (
213-
InputStream inputStream = bytes.streamInput();
214+
InputStream inputStream = CompressorFactory.COMPRESSOR.uncompress(bytes).streamInput();
214215
XContentParser parser = XContentFactory.xContentType(inputStream)
215216
.xContent()
216217
.createParser(xContentRegistry(), DeprecationHandler.THROW_UNSUPPORTED_OPERATION, inputStream)

0 commit comments

Comments
 (0)