diff --git a/cluster/cluster.go b/cluster/cluster.go index e0f4588e..8f6f2bb5 100644 --- a/cluster/cluster.go +++ b/cluster/cluster.go @@ -1697,6 +1697,11 @@ func (c *cluster) sentinel() { "num_peers": stats.NumPeers, }).Log("Stats") + if stats.NumPeers > 1 { + // Enable emergency leadership only in a configuration with two nodes. + break + } + if stats.LastContact > c.emergencyLeaderTimeout && !isEmergencyLeader { c.logger.Warn().Log("Force leadership due to lost contact to leader") c.raftEmergencyNotifyCh <- true diff --git a/cluster/leader.go b/cluster/leader.go index 50da474c..766b3bf2 100644 --- a/cluster/leader.go +++ b/cluster/leader.go @@ -348,10 +348,7 @@ func (c *cluster) synchronizeAndRebalance(ctx context.Context, interval time.Dur } c.doSynchronize(emergency) - - if !emergency { - c.doRebalance(emergency) - } + c.doRebalance(emergency) } else { c.doSynchronize(emergency) } @@ -588,6 +585,11 @@ func (c *cluster) doSynchronize(emergency bool) { } func (c *cluster) doRebalance(emergency bool) { + if emergency { + // Don't rebalance in emergency mode + return + } + have := c.proxy.ListProxyProcesses() nodes := c.proxy.ListNodes()