Skip to content

Commit e712d4a

Browse files
Implement repair functionality for aliases colliding with indices bug
Follow up to elastic#91456 implementing an automated fix for indices corrupted in 8.5.
1 parent ab4c6ed commit e712d4a

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
package org.elasticsearch.cluster.metadata;
1010

11+
import org.apache.logging.log4j.LogManager;
12+
import org.apache.logging.log4j.Logger;
1113
import org.elasticsearch.Version;
1214
import org.elasticsearch.action.admin.indices.rollover.RolloverInfo;
1315
import org.elasticsearch.action.support.ActiveShardCount;
@@ -83,6 +85,8 @@
8385

8486
public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragment {
8587

88+
private static final Logger logger = LogManager.getLogger(IndexMetadata.class);
89+
8690
public static final ClusterBlock INDEX_READ_ONLY_BLOCK = new ClusterBlock(
8791
5,
8892
"index read-only (api)",
@@ -2140,7 +2144,16 @@ public IndexMetadata build() {
21402144
var aliasesMap = aliases.build();
21412145
for (AliasMetadata alias : aliasesMap.values()) {
21422146
if (alias.alias().equals(index)) {
2143-
throw new IllegalArgumentException("alias name [" + index + "] self-conflicts with index name");
2147+
if (indexCreatedVersion.equals(Version.V_8_5_0)) {
2148+
var updatedBuilder = ImmutableOpenMap.builder(aliasesMap);
2149+
final var brokenAlias = updatedBuilder.remove(index);
2150+
final var fixedAlias = AliasMetadata.newAliasMetadata(brokenAlias, index + "-alias-corrupted-by-8-5");
2151+
aliasesMap = updatedBuilder.fPut(fixedAlias.getAlias(), fixedAlias).build();
2152+
logger.warn("Repaired corrupted alias with the same name as its index for [{}]", index);
2153+
break;
2154+
} else {
2155+
throw new IllegalArgumentException("alias name [" + index + "] self-conflicts with index name");
2156+
}
21442157
}
21452158
}
21462159

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import static org.elasticsearch.cluster.metadata.IndexMetadata.parseIndexNameCounter;
4848
import static org.hamcrest.Matchers.containsString;
4949
import static org.hamcrest.Matchers.equalTo;
50+
import static org.hamcrest.Matchers.hasKey;
5051
import static org.hamcrest.Matchers.is;
5152

5253
public class IndexMetadataTests extends ESTestCase {
@@ -509,6 +510,16 @@ public void testIndexAndAliasWithSameName() {
509510
assertEquals("alias name [index] self-conflicts with index name", iae.getMessage());
510511
}
511512

513+
public void testRepairIndexAndAliasWithSameName() {
514+
final IndexMetadata indexMetadata = IndexMetadata.builder("index")
515+
.settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, Version.V_8_5_0))
516+
.numberOfShards(1)
517+
.numberOfReplicas(0)
518+
.putAlias(AliasMetadata.builder("index").build())
519+
.build();
520+
assertThat(indexMetadata.getAliases(), hasKey("index-alias-corrupted-by-8-5"));
521+
}
522+
512523
private static Settings indexSettingsWithDataTier(String dataTier) {
513524
return Settings.builder()
514525
.put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT)

0 commit comments

Comments
 (0)