From d6b1f8ec2ef1564d3c249a9312c95155db5fbd46 Mon Sep 17 00:00:00 2001 From: Armin Braun Date: Fri, 28 Jan 2022 10:52:48 +0100 Subject: [PATCH] Speed up Building Indices Lookup in Metadata We can speed this up by almost a third in case of a large index count where most indices are part of a datastream by avoiding the double lookup for the ds abstraction in the way done here. Also, simplified the loop iteration a little to use the slightly faster cursor and removed some needless conditional in the loop. --- .../cluster/metadata/Metadata.java | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java index ad1d2af07e9ac..437f986c6ad37 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java @@ -1792,7 +1792,7 @@ static SortedMap buildIndicesLookup( ImmutableOpenMap indices ) { SortedMap indicesLookup = new TreeMap<>(); - Map indexToDataStreamLookup = new HashMap<>(); + Map indexToDataStreamLookup = new HashMap<>(); // If there are no indices, then skip data streams. This happens only when metadata is read from disk if (dataStreamMetadata != null && indices.size() > 0) { Map> dataStreamToAliasLookup = new HashMap<>(); @@ -1817,6 +1817,7 @@ static SortedMap buildIndicesLookup( assert dataStream.getIndices().isEmpty() == false; List aliases = dataStreamToAliasLookup.getOrDefault(dataStream.getName(), List.of()); + final IndexAbstraction.DataStream dsAbstraction = new IndexAbstraction.DataStream(dataStream, aliases); IndexAbstraction existing = indicesLookup.put( dataStream.getName(), new IndexAbstraction.DataStream(dataStream, aliases) @@ -1824,28 +1825,19 @@ static SortedMap buildIndicesLookup( assert existing == null : "duplicate data stream for " + dataStream.getName(); for (Index i : dataStream.getIndices()) { - indexToDataStreamLookup.put(i.getName(), dataStream); + indexToDataStreamLookup.put(i.getName(), dsAbstraction); } } } Map> aliasToIndices = new HashMap<>(); - for (var indexMetadata : indices.values()) { - ConcreteIndex index; - DataStream parent = indexToDataStreamLookup.get(indexMetadata.getIndex().getName()); - if (parent != null) { - assert parent.getIndices() - .stream() - .map(Index::getName) - .collect(Collectors.toList()) - .contains(indexMetadata.getIndex().getName()) - : "Expected data stream [" + parent.getName() + "] to contain index " + indexMetadata.getIndex(); - index = new ConcreteIndex(indexMetadata, (IndexAbstraction.DataStream) indicesLookup.get(parent.getName())); - } else { - index = new ConcreteIndex(indexMetadata); - } - - IndexAbstraction existing = indicesLookup.put(indexMetadata.getIndex().getName(), index); + for (var entry : indices) { + final String name = entry.key; + final IndexMetadata indexMetadata = entry.value; + final IndexAbstraction.DataStream parent = indexToDataStreamLookup.get(name); + assert parent == null || parent.getIndices().stream().anyMatch(index -> name.equals(index.getName())) + : "Expected data stream [" + parent.getName() + "] to contain index " + indexMetadata.getIndex(); + IndexAbstraction existing = indicesLookup.put(name, new ConcreteIndex(indexMetadata, parent)); assert existing == null : "duplicate for " + indexMetadata.getIndex(); for (var aliasCursor : indexMetadata.getAliases()) {