when trying to rejoin the cluster, clean the routing/metadata so the node will get fresh shards

This commit is contained in:
kimchy 2010-07-21 08:55:35 +03:00
parent 15cf7a2361
commit 3629540953
1 changed files with 14 additions and 1 deletions

View File

@ -28,6 +28,7 @@ import org.elasticsearch.cluster.block.ClusterBlocks;
import org.elasticsearch.cluster.metadata.MetaData; import org.elasticsearch.cluster.metadata.MetaData;
import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNode;
import org.elasticsearch.cluster.node.DiscoveryNodes; import org.elasticsearch.cluster.node.DiscoveryNodes;
import org.elasticsearch.cluster.routing.RoutingTable;
import org.elasticsearch.common.UUID; import org.elasticsearch.common.UUID;
import org.elasticsearch.common.component.AbstractLifecycleComponent; import org.elasticsearch.common.component.AbstractLifecycleComponent;
import org.elasticsearch.common.component.Lifecycle; import org.elasticsearch.common.component.Lifecycle;
@ -350,6 +351,8 @@ public class ZenDiscovery extends AbstractLifecycleComponent<Discovery> implemen
} }
ClusterBlocks clusterBlocks = currentState.blocks(); ClusterBlocks clusterBlocks = currentState.blocks();
MetaData metaData = currentState.metaData();
RoutingTable routingTable = currentState.routingTable();
List<DiscoveryNode> nodes = newArrayList(currentState.nodes().nodes().values()); List<DiscoveryNode> nodes = newArrayList(currentState.nodes().nodes().values());
nodes.remove(masterNode); // remove the master node from the list, it has failed nodes.remove(masterNode); // remove the master node from the list, it has failed
final DiscoveryNode electedMaster = electMaster.electMaster(nodes); // elect master final DiscoveryNode electedMaster = electMaster.electMaster(nodes); // elect master
@ -375,6 +378,11 @@ public class ZenDiscovery extends AbstractLifecycleComponent<Discovery> implemen
logger.warn("master_left and no other node elected to become master, current nodes: {}", nodes); logger.warn("master_left and no other node elected to become master, current nodes: {}", nodes);
builder.masterNodeId(null); builder.masterNodeId(null);
clusterBlocks = ClusterBlocks.builder().blocks(clusterBlocks).addGlobalBlock(NO_MASTER_BLOCK).build(); clusterBlocks = ClusterBlocks.builder().blocks(clusterBlocks).addGlobalBlock(NO_MASTER_BLOCK).build();
// if this is a data node, clean the metadata and routing, since we want to recreate the indices and shards
if (currentState.nodes().localNode().dataNode()) {
metaData = MetaData.newMetaDataBuilder().build();
routingTable = RoutingTable.newRoutingTableBuilder().build();
}
masterFD.stop("no master elected since master left (reason = " + reason + ")"); masterFD.stop("no master elected since master left (reason = " + reason + ")");
// try and join the cluster again... // try and join the cluster again...
threadPool.cached().execute(new Runnable() { threadPool.cached().execute(new Runnable() {
@ -384,7 +392,12 @@ public class ZenDiscovery extends AbstractLifecycleComponent<Discovery> implemen
}); });
} }
latestDiscoNodes = builder.build(); latestDiscoNodes = builder.build();
return newClusterStateBuilder().state(currentState).blocks(clusterBlocks).nodes(latestDiscoNodes).build(); return newClusterStateBuilder().state(currentState)
.blocks(clusterBlocks)
.nodes(latestDiscoNodes)
.metaData(metaData)
.routingTable(routingTable)
.build();
} }
} }