Skip to content

Commit

Permalink
Import replicated closed dangling indices (elastic#50649)
Browse files Browse the repository at this point in the history
Dangling replicated closed indices are not imported properly (they miss their routing table when imported).
  • Loading branch information
ywelsch committed Jan 8, 2020
1 parent b1ff74f commit f203c2b
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ public Builder addAsRecovery(IndexMetaData indexMetaData) {
}

public Builder addAsFromDangling(IndexMetaData indexMetaData) {
if (indexMetaData.getState() == IndexMetaData.State.OPEN) {
if (indexMetaData.getState() == IndexMetaData.State.OPEN || isIndexVerifiedBeforeClosed(indexMetaData)) {
IndexRoutingTable.Builder indexRoutingBuilder = new IndexRoutingTable.Builder(indexMetaData.getIndex())
.initializeAsFromDangling(indexMetaData);
add(indexRoutingBuilder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@
import java.util.Arrays;
import java.util.Collection;

import static org.elasticsearch.cluster.metadata.MetaDataIndexStateService.isIndexVerifiedBeforeClosed;

public class LocalAllocateDangledIndices {

private static final Logger logger = LogManager.getLogger(LocalAllocateDangledIndices.class);
Expand Down Expand Up @@ -149,7 +151,7 @@ public ClusterState execute(ClusterState currentState) {
}
metaData.put(upgradedIndexMetaData, false);
blocks.addBlocks(upgradedIndexMetaData);
if (upgradedIndexMetaData.getState() == IndexMetaData.State.OPEN) {
if (upgradedIndexMetaData.getState() == IndexMetaData.State.OPEN || isIndexVerifiedBeforeClosed(indexMetaData)) {
routingTableBuilder.addAsFromDangling(upgradedIndexMetaData);
}
sb.append("[").append(upgradedIndexMetaData.getIndex()).append("/").append(upgradedIndexMetaData.getState())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ public void testDanglingIndicesAreRecoveredWhenSettingIsEnabled() throws Excepti

createIndex(INDEX_NAME, Settings.builder().put("number_of_replicas", 2).build());

if (randomBoolean()) {
client().admin().indices().prepareClose(INDEX_NAME).get();
}
ensureGreen(INDEX_NAME);

// Restart node, deleting the index in its absence, so that there is a dangling index to recover
internalCluster().restartRandomDataNode(new InternalTestCluster.RestartCallback() {

Expand All @@ -64,6 +69,7 @@ public Settings onNodeStopped(String nodeName) throws Exception {
});

assertBusy(() -> assertTrue("Expected dangling index " + INDEX_NAME + " to be recovered", indexExists(INDEX_NAME)));
ensureGreen(INDEX_NAME);
}

/**
Expand Down

0 comments on commit f203c2b

Please sign in to comment.