1
0
Эх сурвалжийг харах

Use Map in ClusterBlocks (#87659)

ClusterBlocks keeps track of cluster wide blocks per index. This map is
not updated often, and so ImmutableOpenMap is not critical. This commit
converts it to using immutable jdk Maps.

relates #86239
Ryan Ernst 3 жил өмнө
parent
commit
6bba585d84

+ 10 - 14
server/src/main/java/org/elasticsearch/cluster/block/ClusterBlocks.java

@@ -12,7 +12,6 @@ import org.elasticsearch.cluster.Diff;
 import org.elasticsearch.cluster.SimpleDiffable;
 import org.elasticsearch.cluster.SimpleDiffable;
 import org.elasticsearch.cluster.metadata.IndexMetadata;
 import org.elasticsearch.cluster.metadata.IndexMetadata;
 import org.elasticsearch.cluster.metadata.MetadataIndexStateService;
 import org.elasticsearch.cluster.metadata.MetadataIndexStateService;
-import org.elasticsearch.common.collect.ImmutableOpenMap;
 import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.io.stream.StreamOutput;
 import org.elasticsearch.common.io.stream.StreamOutput;
 import org.elasticsearch.common.util.set.Sets;
 import org.elasticsearch.common.util.set.Sets;
@@ -36,15 +35,15 @@ import static java.util.stream.Collectors.toSet;
  * Represents current cluster level blocks to block dirty operations done against the cluster.
  * Represents current cluster level blocks to block dirty operations done against the cluster.
  */
  */
 public class ClusterBlocks implements SimpleDiffable<ClusterBlocks> {
 public class ClusterBlocks implements SimpleDiffable<ClusterBlocks> {
-    public static final ClusterBlocks EMPTY_CLUSTER_BLOCK = new ClusterBlocks(emptySet(), ImmutableOpenMap.of());
+    public static final ClusterBlocks EMPTY_CLUSTER_BLOCK = new ClusterBlocks(emptySet(), Map.of());
 
 
     private final Set<ClusterBlock> global;
     private final Set<ClusterBlock> global;
 
 
-    private final ImmutableOpenMap<String, Set<ClusterBlock>> indicesBlocks;
+    private final Map<String, Set<ClusterBlock>> indicesBlocks;
 
 
     private final EnumMap<ClusterBlockLevel, ImmutableLevelHolder> levelHolders;
     private final EnumMap<ClusterBlockLevel, ImmutableLevelHolder> levelHolders;
 
 
-    ClusterBlocks(Set<ClusterBlock> global, ImmutableOpenMap<String, Set<ClusterBlock>> indicesBlocks) {
+    ClusterBlocks(Set<ClusterBlock> global, Map<String, Set<ClusterBlock>> indicesBlocks) {
         this.global = global;
         this.global = global;
         this.indicesBlocks = indicesBlocks;
         this.indicesBlocks = indicesBlocks;
         levelHolders = generateLevelHolders(global, indicesBlocks);
         levelHolders = generateLevelHolders(global, indicesBlocks);
@@ -72,7 +71,7 @@ public class ClusterBlocks implements SimpleDiffable<ClusterBlocks> {
 
 
     private static EnumMap<ClusterBlockLevel, ImmutableLevelHolder> generateLevelHolders(
     private static EnumMap<ClusterBlockLevel, ImmutableLevelHolder> generateLevelHolders(
         Set<ClusterBlock> global,
         Set<ClusterBlock> global,
-        ImmutableOpenMap<String, Set<ClusterBlock>> indicesBlocks
+        Map<String, Set<ClusterBlock>> indicesBlocks
     ) {
     ) {
 
 
         EnumMap<ClusterBlockLevel, ImmutableLevelHolder> levelHolders = new EnumMap<>(ClusterBlockLevel.class);
         EnumMap<ClusterBlockLevel, ImmutableLevelHolder> levelHolders = new EnumMap<>(ClusterBlockLevel.class);
@@ -80,11 +79,11 @@ public class ClusterBlocks implements SimpleDiffable<ClusterBlocks> {
             Predicate<ClusterBlock> containsLevel = block -> block.contains(level);
             Predicate<ClusterBlock> containsLevel = block -> block.contains(level);
             Set<ClusterBlock> newGlobal = unmodifiableSet(global.stream().filter(containsLevel).collect(toSet()));
             Set<ClusterBlock> newGlobal = unmodifiableSet(global.stream().filter(containsLevel).collect(toSet()));
 
 
-            ImmutableOpenMap.Builder<String, Set<ClusterBlock>> indicesBuilder = ImmutableOpenMap.builder();
+            Map<String, Set<ClusterBlock>> indicesBuilder = new HashMap<>();
             for (Map.Entry<String, Set<ClusterBlock>> entry : indicesBlocks.entrySet()) {
             for (Map.Entry<String, Set<ClusterBlock>> entry : indicesBlocks.entrySet()) {
                 indicesBuilder.put(entry.getKey(), unmodifiableSet(entry.getValue().stream().filter(containsLevel).collect(toSet())));
                 indicesBuilder.put(entry.getKey(), unmodifiableSet(entry.getValue().stream().filter(containsLevel).collect(toSet())));
             }
             }
-            levelHolders.put(level, new ImmutableLevelHolder(newGlobal, indicesBuilder.build()));
+            levelHolders.put(level, new ImmutableLevelHolder(newGlobal, Map.copyOf(indicesBuilder)));
         }
         }
         return levelHolders;
         return levelHolders;
     }
     }
@@ -275,10 +274,7 @@ public class ClusterBlocks implements SimpleDiffable<ClusterBlocks> {
 
 
     public static ClusterBlocks readFrom(StreamInput in) throws IOException {
     public static ClusterBlocks readFrom(StreamInput in) throws IOException {
         final Set<ClusterBlock> global = readBlockSet(in);
         final Set<ClusterBlock> global = readBlockSet(in);
-        ImmutableOpenMap<String, Set<ClusterBlock>> indicesBlocks = in.readImmutableOpenMap(
-            i -> i.readString().intern(),
-            ClusterBlocks::readBlockSet
-        );
+        Map<String, Set<ClusterBlock>> indicesBlocks = in.readImmutableMap(i -> i.readString().intern(), ClusterBlocks::readBlockSet);
         if (global.isEmpty() && indicesBlocks.isEmpty()) {
         if (global.isEmpty() && indicesBlocks.isEmpty()) {
             return EMPTY_CLUSTER_BLOCK;
             return EMPTY_CLUSTER_BLOCK;
         }
         }
@@ -294,7 +290,7 @@ public class ClusterBlocks implements SimpleDiffable<ClusterBlocks> {
         return SimpleDiffable.readDiffFrom(ClusterBlocks::readFrom, in);
         return SimpleDiffable.readDiffFrom(ClusterBlocks::readFrom, in);
     }
     }
 
 
-    record ImmutableLevelHolder(Set<ClusterBlock> global, ImmutableOpenMap<String, Set<ClusterBlock>> indices) {}
+    record ImmutableLevelHolder(Set<ClusterBlock> global, Map<String, Set<ClusterBlock>> indices) {}
 
 
     public static Builder builder() {
     public static Builder builder() {
         return new Builder();
         return new Builder();
@@ -418,11 +414,11 @@ public class ClusterBlocks implements SimpleDiffable<ClusterBlocks> {
                 return EMPTY_CLUSTER_BLOCK;
                 return EMPTY_CLUSTER_BLOCK;
             }
             }
             // We copy the block sets here in case of the builder is modified after build is called
             // We copy the block sets here in case of the builder is modified after build is called
-            ImmutableOpenMap.Builder<String, Set<ClusterBlock>> indicesBuilder = ImmutableOpenMap.builder(indices.size());
+            Map<String, Set<ClusterBlock>> indicesBuilder = new HashMap<>(indices.size());
             for (Map.Entry<String, Set<ClusterBlock>> entry : indices.entrySet()) {
             for (Map.Entry<String, Set<ClusterBlock>> entry : indices.entrySet()) {
                 indicesBuilder.put(entry.getKey(), Set.copyOf(entry.getValue()));
                 indicesBuilder.put(entry.getKey(), Set.copyOf(entry.getValue()));
             }
             }
-            return new ClusterBlocks(Set.copyOf(global), indicesBuilder.build());
+            return new ClusterBlocks(Set.copyOf(global), Map.copyOf(indicesBuilder));
         }
         }
     }
     }
 }
 }

+ 2 - 2
server/src/test/java/org/elasticsearch/cluster/block/ClusterBlockTests.java

@@ -10,7 +10,6 @@ package org.elasticsearch.cluster.block;
 
 
 import org.elasticsearch.Version;
 import org.elasticsearch.Version;
 import org.elasticsearch.common.UUIDs;
 import org.elasticsearch.common.UUIDs;
-import org.elasticsearch.common.collect.ImmutableOpenMap;
 import org.elasticsearch.common.io.stream.BytesStreamOutput;
 import org.elasticsearch.common.io.stream.BytesStreamOutput;
 import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.rest.RestStatus;
 import org.elasticsearch.rest.RestStatus;
@@ -19,6 +18,7 @@ import org.elasticsearch.test.ESTestCase;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 import static java.util.EnumSet.copyOf;
 import static java.util.EnumSet.copyOf;
 import static org.elasticsearch.test.VersionUtils.randomVersion;
 import static org.elasticsearch.test.VersionUtils.randomVersion;
@@ -56,7 +56,7 @@ public class ClusterBlockTests extends ESTestCase {
 
 
     public void testGlobalBlocksCheckedIfNoIndicesSpecified() {
     public void testGlobalBlocksCheckedIfNoIndicesSpecified() {
         ClusterBlock globalBlock = randomClusterBlock();
         ClusterBlock globalBlock = randomClusterBlock();
-        ClusterBlocks clusterBlocks = new ClusterBlocks(Collections.singleton(globalBlock), ImmutableOpenMap.of());
+        ClusterBlocks clusterBlocks = new ClusterBlocks(Collections.singleton(globalBlock), Map.of());
         ClusterBlockException exception = clusterBlocks.indicesBlockedException(randomFrom(globalBlock.levels()), new String[0]);
         ClusterBlockException exception = clusterBlocks.indicesBlockedException(randomFrom(globalBlock.levels()), new String[0]);
         assertNotNull(exception);
         assertNotNull(exception);
         assertEquals(exception.blocks(), Collections.singleton(globalBlock));
         assertEquals(exception.blocks(), Collections.singleton(globalBlock));