LDM trigger to move raft leaders

Signed-off-by: Derek Collison <derek@nats.io>
This commit is contained in:
Derek Collison
2021-01-25 16:52:19 -08:00
parent c8a75e1ed0
commit d278996272
2 changed files with 36 additions and 0 deletions

View File

@@ -369,6 +369,31 @@ func (s *Server) lookupRaftNode(group string) RaftNode {
return n
}
func (s *Server) transferRaftLeaders() bool {
if s == nil {
return false
}
var nodes []RaftNode
s.rnMu.RLock()
if len(s.raftNodes) > 0 {
s.Noticef("Transferring any raft leaders")
}
for _, n := range s.raftNodes {
nodes = append(nodes, n)
}
s.rnMu.RUnlock()
var didTransfer bool
for _, node := range nodes {
if node.Leader() {
node.StepDown()
didTransfer = true
}
}
return didTransfer
}
func (s *Server) shutdownRaftNodes() {
if s == nil {
return
@@ -380,6 +405,7 @@ func (s *Server) shutdownRaftNodes() {
nodes = append(nodes, n)
}
s.rnMu.RUnlock()
for _, node := range nodes {
if node.Leader() {
node.StepDown()

View File

@@ -3060,6 +3060,16 @@ func (s *Server) lameDuckMode() {
}
s.mu.Unlock()
// If we are running any raftNodes transfer leaders.
if hadTransfers := s.transferRaftLeaders(); hadTransfers {
// They will tranfer leadership quickly, but wait here for a second.
select {
case <-time.After(time.Second):
case <-s.quitCh:
return
}
}
// Wait for accept loops to be done to make sure that no new
// client can connect
for i := 0; i < expected; i++ {