Browse Source

Cache index.hidden setting (#78612)

We look up the value for `index.hidden` for every index every time we
build a new `Metadata`, which involves map lookups and string parsing
and so on and takes nontrivial time. This commit moves the value to a
field so the lookups are only needed if the index metadata changes.

Closes #77974
David Turner 4 years ago
parent
commit
9aef3315b2

+ 9 - 0
server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java

@@ -389,6 +389,7 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
     private final ActiveShardCount waitForActiveShards;
     private final ImmutableOpenMap<String, RolloverInfo> rolloverInfos;
     private final boolean isSystem;
+    private final boolean isHidden;
 
     private final IndexLongFieldRange timestampRange;
 
@@ -421,6 +422,7 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
             final ActiveShardCount waitForActiveShards,
             final ImmutableOpenMap<String, RolloverInfo> rolloverInfos,
             final boolean isSystem,
+            final boolean isHidden,
             final IndexLongFieldRange timestampRange,
             final int priority,
             final long creationDate) {
@@ -455,6 +457,8 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
         this.waitForActiveShards = waitForActiveShards;
         this.rolloverInfos = rolloverInfos;
         this.isSystem = isSystem;
+        assert isHidden == INDEX_HIDDEN_SETTING.get(settings);
+        this.isHidden = isHidden;
         this.timestampRange = timestampRange;
         this.priority = priority;
         this.creationDate = creationDate;
@@ -938,6 +942,10 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
         return isSystem;
     }
 
+    public boolean isHidden() {
+        return isHidden;
+    }
+
     public int priority() {
         return priority;
     }
@@ -1318,6 +1326,7 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
                     waitForActiveShards,
                     rolloverInfos.build(),
                     isSystem,
+                    INDEX_HIDDEN_SETTING.get(settings),
                     timestampRange,
                     IndexMetadata.INDEX_PRIORITY_SETTING.get(settings),
                     settings.getAsLong(SETTING_CREATION_DATE, -1L)

+ 1 - 1
server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java

@@ -1450,7 +1450,7 @@ public class Metadata implements Iterable<IndexMetadata>, Diffable<Metadata>, To
                 final String name = indexMetadata.getIndex().getName();
                 boolean added = allIndices.add(name);
                 assert added : "double index named [" + name + "]";
-                final boolean visible = IndexMetadata.INDEX_HIDDEN_SETTING.get(indexMetadata.getSettings()) == false;
+                final boolean visible = indexMetadata.isHidden() == false;
                 if (visible) {
                     visibleIndices.add(name);
                 }

+ 1 - 1
server/src/main/java/org/elasticsearch/snapshots/RestoreService.java

@@ -1545,7 +1545,7 @@ public class RestoreService implements ClusterStateApplier {
     }
 
     private void ensureValidIndexName(ClusterState currentState, IndexMetadata snapshotIndexMetadata, String renamedIndexName) {
-        final boolean isHidden = IndexMetadata.INDEX_HIDDEN_SETTING.get(snapshotIndexMetadata.getSettings());
+        final boolean isHidden = snapshotIndexMetadata.isHidden();
         createIndexService.validateIndexName(renamedIndexName, currentState);
         createIndexService.validateDotIndex(renamedIndexName, isHidden);
         createIndexService.validateIndexSettings(renamedIndexName, snapshotIndexMetadata.getSettings(), false);

+ 22 - 0
server/src/test/java/org/elasticsearch/cluster/metadata/IndexMetadataTests.java

@@ -8,6 +8,7 @@
 
 package org.elasticsearch.cluster.metadata;
 
+import org.elasticsearch.Version;
 import org.elasticsearch.action.admin.indices.rollover.MaxAgeCondition;
 import org.elasticsearch.action.admin.indices.rollover.MaxDocsCondition;
 import org.elasticsearch.action.admin.indices.rollover.MaxPrimaryShardSizeCondition;
@@ -40,6 +41,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static org.elasticsearch.cluster.metadata.IndexMetadata.INDEX_HIDDEN_SETTING;
 import static org.elasticsearch.cluster.metadata.IndexMetadata.parseIndexNameCounter;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.equalTo;
@@ -366,4 +368,24 @@ public class IndexMetadataTests extends ESTestCase {
         }
     }
 
+    public void testIsHidden() {
+        Settings.Builder settings = Settings.builder()
+            .put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, randomIntBetween(1, 8))
+            .put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, 0)
+            .put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT);
+        IndexMetadata indexMetadata = IndexMetadata.builder("test").settings(settings).build();
+        assertFalse(indexMetadata.isHidden());
+
+        settings.put(INDEX_HIDDEN_SETTING.getKey(), "false");
+        indexMetadata = IndexMetadata.builder(indexMetadata).settings(settings).build();
+        assertFalse(indexMetadata.isHidden());
+
+        settings.put(INDEX_HIDDEN_SETTING.getKey(), "true");
+        indexMetadata = IndexMetadata.builder(indexMetadata).settings(settings).build();
+        assertTrue(indexMetadata.isHidden());
+
+        indexMetadata = IndexMetadata.builder(indexMetadata).build();
+        assertTrue(indexMetadata.isHidden()); // preserved if settings unchanged
+    }
+
 }