From 9aef3315b2e2d5e9de25e4b98f528eb01befd84c Mon Sep 17 00:00:00 2001 From: David Turner Date: Mon, 4 Oct 2021 15:27:21 +0100 Subject: [PATCH] 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 --- .../cluster/metadata/IndexMetadata.java | 9 ++++++++ .../cluster/metadata/Metadata.java | 2 +- .../snapshots/RestoreService.java | 2 +- .../cluster/metadata/IndexMetadataTests.java | 22 +++++++++++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java index d4f3b919a2b2..3daef056f551 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java @@ -389,6 +389,7 @@ public class IndexMetadata implements Diffable, ToXContentFragmen private final ActiveShardCount waitForActiveShards; private final ImmutableOpenMap rolloverInfos; private final boolean isSystem; + private final boolean isHidden; private final IndexLongFieldRange timestampRange; @@ -421,6 +422,7 @@ public class IndexMetadata implements Diffable, ToXContentFragmen final ActiveShardCount waitForActiveShards, final ImmutableOpenMap 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, 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, ToXContentFragmen return isSystem; } + public boolean isHidden() { + return isHidden; + } + public int priority() { return priority; } @@ -1318,6 +1326,7 @@ public class IndexMetadata implements Diffable, ToXContentFragmen waitForActiveShards, rolloverInfos.build(), isSystem, + INDEX_HIDDEN_SETTING.get(settings), timestampRange, IndexMetadata.INDEX_PRIORITY_SETTING.get(settings), settings.getAsLong(SETTING_CREATION_DATE, -1L) 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 30c3442d8c0c..cce12421ee6e 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java @@ -1450,7 +1450,7 @@ public class Metadata implements Iterable, Diffable, 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); } diff --git a/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java b/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java index be817c71885e..f8514a50bdd7 100644 --- a/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java +++ b/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); diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexMetadataTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexMetadataTests.java index 727b43e4cbdc..10c679224b87 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexMetadataTests.java +++ b/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 + } + }