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
This commit is contained in:
David Turner 2021-10-04 15:27:21 +01:00 committed by GitHub
parent abdffdaf40
commit 9aef3315b2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 2 deletions

View file

@ -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)

View file

@ -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);
}

View file

@ -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);

View file

@ -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
}
}