Skip to content

Commit 9aef331

Browse files
authored
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
1 parent abdffda commit 9aef331

File tree

4 files changed

+33
-2
lines changed

4 files changed

+33
-2
lines changed

server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ public static APIBlock readFrom(StreamInput input) throws IOException {
389389
private final ActiveShardCount waitForActiveShards;
390390
private final ImmutableOpenMap<String, RolloverInfo> rolloverInfos;
391391
private final boolean isSystem;
392+
private final boolean isHidden;
392393

393394
private final IndexLongFieldRange timestampRange;
394395

@@ -421,6 +422,7 @@ private IndexMetadata(
421422
final ActiveShardCount waitForActiveShards,
422423
final ImmutableOpenMap<String, RolloverInfo> rolloverInfos,
423424
final boolean isSystem,
425+
final boolean isHidden,
424426
final IndexLongFieldRange timestampRange,
425427
final int priority,
426428
final long creationDate) {
@@ -455,6 +457,8 @@ private IndexMetadata(
455457
this.waitForActiveShards = waitForActiveShards;
456458
this.rolloverInfos = rolloverInfos;
457459
this.isSystem = isSystem;
460+
assert isHidden == INDEX_HIDDEN_SETTING.get(settings);
461+
this.isHidden = isHidden;
458462
this.timestampRange = timestampRange;
459463
this.priority = priority;
460464
this.creationDate = creationDate;
@@ -938,6 +942,10 @@ public boolean isSystem() {
938942
return isSystem;
939943
}
940944

945+
public boolean isHidden() {
946+
return isHidden;
947+
}
948+
941949
public int priority() {
942950
return priority;
943951
}
@@ -1318,6 +1326,7 @@ public IndexMetadata build() {
13181326
waitForActiveShards,
13191327
rolloverInfos.build(),
13201328
isSystem,
1329+
INDEX_HIDDEN_SETTING.get(settings),
13211330
timestampRange,
13221331
IndexMetadata.INDEX_PRIORITY_SETTING.get(settings),
13231332
settings.getAsLong(SETTING_CREATION_DATE, -1L)

server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1450,7 +1450,7 @@ public Metadata build() {
14501450
final String name = indexMetadata.getIndex().getName();
14511451
boolean added = allIndices.add(name);
14521452
assert added : "double index named [" + name + "]";
1453-
final boolean visible = IndexMetadata.INDEX_HIDDEN_SETTING.get(indexMetadata.getSettings()) == false;
1453+
final boolean visible = indexMetadata.isHidden() == false;
14541454
if (visible) {
14551455
visibleIndices.add(name);
14561456
}

server/src/main/java/org/elasticsearch/snapshots/RestoreService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1545,7 +1545,7 @@ private static IndexMetadata.Builder restoreOverClosedIndex(IndexMetadata snapsh
15451545
}
15461546

15471547
private void ensureValidIndexName(ClusterState currentState, IndexMetadata snapshotIndexMetadata, String renamedIndexName) {
1548-
final boolean isHidden = IndexMetadata.INDEX_HIDDEN_SETTING.get(snapshotIndexMetadata.getSettings());
1548+
final boolean isHidden = snapshotIndexMetadata.isHidden();
15491549
createIndexService.validateIndexName(renamedIndexName, currentState);
15501550
createIndexService.validateDotIndex(renamedIndexName, isHidden);
15511551
createIndexService.validateIndexSettings(renamedIndexName, snapshotIndexMetadata.getSettings(), false);

server/src/test/java/org/elasticsearch/cluster/metadata/IndexMetadataTests.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
package org.elasticsearch.cluster.metadata;
1010

11+
import org.elasticsearch.Version;
1112
import org.elasticsearch.action.admin.indices.rollover.MaxAgeCondition;
1213
import org.elasticsearch.action.admin.indices.rollover.MaxDocsCondition;
1314
import org.elasticsearch.action.admin.indices.rollover.MaxPrimaryShardSizeCondition;
@@ -40,6 +41,7 @@
4041
import java.util.Map;
4142
import java.util.Set;
4243

44+
import static org.elasticsearch.cluster.metadata.IndexMetadata.INDEX_HIDDEN_SETTING;
4345
import static org.elasticsearch.cluster.metadata.IndexMetadata.parseIndexNameCounter;
4446
import static org.hamcrest.Matchers.containsString;
4547
import static org.hamcrest.Matchers.equalTo;
@@ -366,4 +368,24 @@ public void testParseIndexNameCannotFormatNumber() {
366368
}
367369
}
368370

371+
public void testIsHidden() {
372+
Settings.Builder settings = Settings.builder()
373+
.put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, randomIntBetween(1, 8))
374+
.put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, 0)
375+
.put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT);
376+
IndexMetadata indexMetadata = IndexMetadata.builder("test").settings(settings).build();
377+
assertFalse(indexMetadata.isHidden());
378+
379+
settings.put(INDEX_HIDDEN_SETTING.getKey(), "false");
380+
indexMetadata = IndexMetadata.builder(indexMetadata).settings(settings).build();
381+
assertFalse(indexMetadata.isHidden());
382+
383+
settings.put(INDEX_HIDDEN_SETTING.getKey(), "true");
384+
indexMetadata = IndexMetadata.builder(indexMetadata).settings(settings).build();
385+
assertTrue(indexMetadata.isHidden());
386+
387+
indexMetadata = IndexMetadata.builder(indexMetadata).build();
388+
assertTrue(indexMetadata.isHidden()); // preserved if settings unchanged
389+
}
390+
369391
}

0 commit comments

Comments
 (0)