From 86305e0e24866410595d3bfd8cb80503689a56e3 Mon Sep 17 00:00:00 2001
From: Artem Prigoda 
Date: Thu, 10 Feb 2022 15:23:31 +0100
Subject: [PATCH 1/2] Make Metadata extend AbstractCollection
So we can get a direct optimized `stream` on it.
---
 .../org/elasticsearch/cluster/metadata/Metadata.java     | 9 ++++++++-
 .../elasticsearch/rest/action/cat/RestIndicesAction.java | 9 ++++-----
 .../existence/FrozenExistenceDeciderService.java         | 5 +++--
 .../autoscaling/shards/FrozenShardsDeciderService.java   | 3 +--
 .../autoscaling/storage/FrozenStorageDeciderService.java | 3 +--
 .../upgrade/SearchableSnapshotIndexMetadataUpgrader.java | 7 ++++---
 .../SearchableSnapshotIndexMetadataUpgraderTests.java    | 4 +---
 7 files changed, 22 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 41f13470fbec2..77b3ca21a0049 100644
--- a/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java
+++ b/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java
@@ -54,6 +54,7 @@
 import org.elasticsearch.xcontent.XContentParser;
 
 import java.io.IOException;
+import java.util.AbstractCollection;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -69,6 +70,7 @@
 import java.util.Optional;
 import java.util.Set;
 import java.util.SortedMap;
+import java.util.Spliterator;
 import java.util.TreeMap;
 import java.util.function.BiPredicate;
 import java.util.function.Consumer;
@@ -86,7 +88,7 @@
  * The details of how this is persisted are covered in {@link org.elasticsearch.gateway.PersistedClusterStateService}.
  * 
  */
-public class Metadata implements Iterable, Diffable, ToXContentFragment {
+public class Metadata extends AbstractCollection implements Diffable, ToXContentFragment {
 
     private static final Logger logger = LogManager.getLogger(Metadata.class);
 
@@ -869,6 +871,11 @@ public Iterator iterator() {
         return indices.valuesIt();
     }
 
+    @Override
+    public int size() {
+        return indices.size();
+    }
+
     public static boolean isGlobalStateEquals(Metadata metadata1, Metadata metadata2) {
         if (metadata1.coordinationMetadata.equals(metadata2.coordinationMetadata) == false) {
             return false;
diff --git a/server/src/main/java/org/elasticsearch/rest/action/cat/RestIndicesAction.java b/server/src/main/java/org/elasticsearch/rest/action/cat/RestIndicesAction.java
index 204aa3b6f002f..e6a85f30b76aa 100644
--- a/server/src/main/java/org/elasticsearch/rest/action/cat/RestIndicesAction.java
+++ b/server/src/main/java/org/elasticsearch/rest/action/cat/RestIndicesAction.java
@@ -49,7 +49,6 @@
 import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
 
 import static java.util.Arrays.asList;
 import static org.elasticsearch.action.support.master.MasterNodeRequest.DEFAULT_MASTER_NODE_TIMEOUT;
@@ -229,10 +228,10 @@ public void onResponse(final Collection responses) {
                         .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
 
                     ClusterStateResponse stateResponse = extractResponse(responses, ClusterStateResponse.class);
-                    Map indicesStates = StreamSupport.stream(
-                        stateResponse.getState().getMetadata().spliterator(),
-                        false
-                    ).collect(Collectors.toMap(indexMetadata -> indexMetadata.getIndex().getName(), Function.identity()));
+                    Map indicesStates = stateResponse.getState()
+                        .getMetadata()
+                        .stream()
+                        .collect(Collectors.toMap(indexMetadata -> indexMetadata.getIndex().getName(), Function.identity()));
 
                     ClusterHealthResponse healthResponse = extractResponse(responses, ClusterHealthResponse.class);
                     Map indicesHealths = healthResponse.getIndices();
diff --git a/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/existence/FrozenExistenceDeciderService.java b/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/existence/FrozenExistenceDeciderService.java
index dd534dfd40915..6b1035c9b7b23 100644
--- a/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/existence/FrozenExistenceDeciderService.java
+++ b/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/existence/FrozenExistenceDeciderService.java
@@ -25,7 +25,6 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
 
 /**
  * This decider looks at all indices and ensures a minimum capacity is available if any indices are in the frozen ILM phase, since that
@@ -45,7 +44,9 @@ public String name() {
 
     @Override
     public AutoscalingDeciderResult scale(Settings configuration, AutoscalingDeciderContext context) {
-        List indicesNeedingFrozen = StreamSupport.stream(context.state().metadata().spliterator(), false)
+        List indicesNeedingFrozen = context.state()
+            .metadata()
+            .stream()
             .filter(this::needsTier)
             .map(imd -> imd.getIndex().getName())
             .limit(10)
diff --git a/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/shards/FrozenShardsDeciderService.java b/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/shards/FrozenShardsDeciderService.java
index 9d405593bb4bb..18044de7b5954 100644
--- a/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/shards/FrozenShardsDeciderService.java
+++ b/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/shards/FrozenShardsDeciderService.java
@@ -25,7 +25,6 @@
 import java.io.IOException;
 import java.util.List;
 import java.util.Objects;
-import java.util.stream.StreamSupport;
 
 /**
  * This decider enforces that on a 64GB memory node (31GB heap) we can max have 2000 shards. We arrive at 2000 because our current limit is
@@ -58,7 +57,7 @@ public AutoscalingDeciderResult scale(Settings configuration, AutoscalingDecider
     }
 
     static int countFrozenShards(Metadata metadata) {
-        return StreamSupport.stream(metadata.spliterator(), false)
+        return metadata.stream()
             .filter(imd -> FrozenUtils.isFrozenIndex(imd.getSettings()))
             .mapToInt(IndexMetadata::getTotalNumberOfShards)
             .sum();
diff --git a/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/storage/FrozenStorageDeciderService.java b/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/storage/FrozenStorageDeciderService.java
index dbaa812c5eafc..5c96e9029c530 100644
--- a/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/storage/FrozenStorageDeciderService.java
+++ b/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/storage/FrozenStorageDeciderService.java
@@ -26,7 +26,6 @@
 import java.io.IOException;
 import java.util.List;
 import java.util.Objects;
-import java.util.stream.StreamSupport;
 
 public class FrozenStorageDeciderService implements AutoscalingDeciderService {
     public static final String NAME = "frozen_storage";
@@ -42,7 +41,7 @@ public String name() {
     @Override
     public AutoscalingDeciderResult scale(Settings configuration, AutoscalingDeciderContext context) {
         Metadata metadata = context.state().metadata();
-        long dataSetSize = StreamSupport.stream(metadata.spliterator(), false)
+        long dataSetSize = metadata.stream()
             .filter(imd -> FrozenUtils.isFrozenIndex(imd.getSettings()))
             .mapToLong(imd -> estimateSize(imd, context.info()))
             .sum();
diff --git a/x-pack/plugin/searchable-snapshots/src/main/java/org/elasticsearch/xpack/searchablesnapshots/upgrade/SearchableSnapshotIndexMetadataUpgrader.java b/x-pack/plugin/searchable-snapshots/src/main/java/org/elasticsearch/xpack/searchablesnapshots/upgrade/SearchableSnapshotIndexMetadataUpgrader.java
index 29a05f4607f98..41810789e0646 100644
--- a/x-pack/plugin/searchable-snapshots/src/main/java/org/elasticsearch/xpack/searchablesnapshots/upgrade/SearchableSnapshotIndexMetadataUpgrader.java
+++ b/x-pack/plugin/searchable-snapshots/src/main/java/org/elasticsearch/xpack/searchablesnapshots/upgrade/SearchableSnapshotIndexMetadataUpgrader.java
@@ -24,7 +24,6 @@
 
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.stream.StreamSupport;
 
 /**
  * This class upgrades frozen indices to apply the index.shard_limit.group=frozen setting after all nodes have been upgraded to 7.13+
@@ -91,7 +90,8 @@ public void onFailure(Exception e) {
     }
 
     static boolean needsUpgrade(ClusterState state) {
-        return StreamSupport.stream(state.metadata().spliterator(), false)
+        return state.metadata()
+            .stream()
             .filter(
                 imd -> imd.getCompatibilityVersion().onOrAfter(Version.V_7_12_0) && imd.getCompatibilityVersion().before(Version.V_8_0_0)
             )
@@ -105,7 +105,8 @@ static ClusterState upgradeIndices(ClusterState currentState) {
             return currentState;
         }
         Metadata.Builder builder = Metadata.builder(currentState.metadata());
-        StreamSupport.stream(currentState.metadata().spliterator(), false)
+        currentState.metadata()
+            .stream()
             .filter(
                 imd -> imd.getCompatibilityVersion().onOrAfter(Version.V_7_12_0) && imd.getCompatibilityVersion().before(Version.V_8_0_0)
             )
diff --git a/x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/upgrade/SearchableSnapshotIndexMetadataUpgraderTests.java b/x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/upgrade/SearchableSnapshotIndexMetadataUpgraderTests.java
index 6571f46cb1fd3..5430d039c3eb8 100644
--- a/x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/upgrade/SearchableSnapshotIndexMetadataUpgraderTests.java
+++ b/x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/upgrade/SearchableSnapshotIndexMetadataUpgraderTests.java
@@ -19,8 +19,6 @@
 import org.elasticsearch.test.ESTestCase;
 import org.elasticsearch.test.VersionUtils;
 
-import java.util.stream.StreamSupport;
-
 import static org.elasticsearch.snapshots.SearchableSnapshotsSettings.SEARCHABLE_SNAPSHOT_STORE_TYPE;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
@@ -71,7 +69,7 @@ public void testUpgradeIndices() {
         assertThat(upgradedState, not(sameInstance(originalState)));
         assertThat(upgradedState.metadata().indices().size(), equalTo(originalState.metadata().indices().size()));
 
-        assertTrue(StreamSupport.stream(upgradedState.metadata().spliterator(), false).anyMatch(upgraded -> {
+        assertTrue(upgradedState.metadata().stream().anyMatch(upgraded -> {
             IndexMetadata original = originalState.metadata().index(upgraded.getIndex());
             assertThat(original, notNullValue());
             if (upgraded.isPartialSearchableSnapshot() == false
From 6186da8f482c75e92fb61d4aba917209ad38fc9a Mon Sep 17 00:00:00 2001
From: Artem Prigoda 
Date: Mon, 14 Feb 2022 10:48:58 +0100
Subject: [PATCH 2/2] Remove unused import
---
 .../main/java/org/elasticsearch/cluster/metadata/Metadata.java   | 1 -
 1 file changed, 1 deletion(-)
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 6f39199d4704c..2531ee686ae50 100644
--- a/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java
+++ b/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java
@@ -70,7 +70,6 @@
 import java.util.Optional;
 import java.util.Set;
 import java.util.SortedMap;
-import java.util.Spliterator;
 import java.util.TreeMap;
 import java.util.function.BiPredicate;
 import java.util.function.Consumer;