diff --git a/src/main/java/org/elasticsearch/discovery/zen/ZenDiscovery.java b/src/main/java/org/elasticsearch/discovery/zen/ZenDiscovery.java index 64bcb91cf62cf..84bd1d04831d1 100644 --- a/src/main/java/org/elasticsearch/discovery/zen/ZenDiscovery.java +++ b/src/main/java/org/elasticsearch/discovery/zen/ZenDiscovery.java @@ -61,6 +61,7 @@ import org.elasticsearch.transport.*; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; @@ -524,6 +525,11 @@ public ClusterState execute(ClusterState currentState) { .masterNodeId(null).build(); latestDiscoNodes = discoveryNodes; + // flush any pending cluster states from old master, so it will not be set as master again + ArrayList pendingNewClusterStates = new ArrayList<>(); + processNewClusterStates.drainTo(pendingNewClusterStates); + logger.trace("removed [{}] pending cluster states", pendingNewClusterStates.size()); + if (rejoinOnMasterGone) { return rejoin(ClusterState.builder(currentState).nodes(discoveryNodes).build(), "master left (reason = " + reason + ")"); } @@ -680,6 +686,11 @@ public ClusterState execute(ClusterState currentState) { // we are going to use it for sure, poll (remove) it potentialState = processNewClusterStates.poll(); + if (potentialState == null) { + // might happen if the queue is drained + break; + } + potentialState.processed = true; if (potentialState.clusterState.version() > stateToProcess.clusterState.version()) {