From c4d9d8afcb2ed3d523057ec6af97a046cd622c2b Mon Sep 17 00:00:00 2001 From: Ingo Oppermann Date: Fri, 30 Jun 2023 16:59:11 +0200 Subject: [PATCH] Make emergency leadership only available in a cluster with two nodes --- cluster/cluster.go | 5 +++++ cluster/leader.go | 10 ++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) 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()