diff --git a/server/src/main/java/org/elasticsearch/gateway/DanglingIndicesState.java b/server/src/main/java/org/elasticsearch/gateway/DanglingIndicesState.java index fefd807d8d8a5..d649c02af4e77 100644 --- a/server/src/main/java/org/elasticsearch/gateway/DanglingIndicesState.java +++ b/server/src/main/java/org/elasticsearch/gateway/DanglingIndicesState.java @@ -143,7 +143,7 @@ Map findNewDanglingIndices(final MetaData metaData) { } else { logger.info("[{}] dangling index exists on local file system, but not in cluster metadata, " + "auto import to cluster state", indexMetaData.getIndex()); - newIndices.put(indexMetaData.getIndex(), indexMetaData); + newIndices.put(indexMetaData.getIndex(), stripAliases(indexMetaData)); } } return newIndices; @@ -153,6 +153,20 @@ Map findNewDanglingIndices(final MetaData metaData) { } } + /** + * Dangling importing indices with aliases is dangerous, it could for instance result in inability to write to an existing alias if it + * previously had only one index with any is_write_index indication. + */ + private IndexMetaData stripAliases(IndexMetaData indexMetaData) { + if (indexMetaData.getAliases().isEmpty()) { + return indexMetaData; + } else { + logger.info("[{}] stripping aliases: {} from index before importing", + indexMetaData.getIndex(), indexMetaData.getAliases().keys()); + return IndexMetaData.builder(indexMetaData).removeAllAliases().build(); + } + } + /** * Allocates the provided list of the dangled indices by sending them to the master node * for allocation. diff --git a/server/src/test/java/org/elasticsearch/gateway/DanglingIndicesStateTests.java b/server/src/test/java/org/elasticsearch/gateway/DanglingIndicesStateTests.java index 9593b58eae97c..e7dfbadeeda78 100644 --- a/server/src/test/java/org/elasticsearch/gateway/DanglingIndicesStateTests.java +++ b/server/src/test/java/org/elasticsearch/gateway/DanglingIndicesStateTests.java @@ -19,6 +19,7 @@ package org.elasticsearch.gateway; import org.elasticsearch.Version; +import org.elasticsearch.cluster.metadata.AliasMetaData; import org.elasticsearch.cluster.metadata.IndexGraveyard; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.MetaData; @@ -158,6 +159,28 @@ public void testDanglingIndicesNotImportedWhenTombstonePresent() throws Exceptio } } + public void testDanglingIndicesStripAliases() throws Exception { + try (NodeEnvironment env = newNodeEnvironment()) { + MetaStateService metaStateService = new MetaStateService(env, xContentRegistry()); + DanglingIndicesState danglingState = createDanglingIndicesState(env, metaStateService); + + final Settings.Builder settings = Settings.builder().put(indexSettings).put(IndexMetaData.SETTING_INDEX_UUID, "test1UUID"); + IndexMetaData dangledIndex = IndexMetaData.builder("test1") + .settings(settings) + .putAlias(AliasMetaData.newAliasMetaDataBuilder("test_aliasd").build()) + .build(); + metaStateService.writeIndex("test_write", dangledIndex); + assertThat(dangledIndex.getAliases().size(), equalTo(1)); + + final MetaData metaData = MetaData.builder().build(); + Map newDanglingIndices = danglingState.findNewDanglingIndices(metaData); + assertThat(newDanglingIndices.size(), equalTo(1)); + Map.Entry entry = newDanglingIndices.entrySet().iterator().next(); + assertThat(entry.getKey().getName(), equalTo("test1")); + assertThat(entry.getValue().getAliases().size(), equalTo(0)); + } + } + private DanglingIndicesState createDanglingIndicesState(NodeEnvironment env, MetaStateService metaStateService) { return new DanglingIndicesState(env, metaStateService, null, mock(ClusterService.class)); }