@@ -570,6 +570,10 @@ func (r *Raft) leaderLoop() {
570570 // based on the current config value.
571571 lease := time .After (r .config ().LeaderLeaseTimeout )
572572
573+ // This would unset leadershipTransferInProgress
574+ // in case it was set during the loop
575+ defer func () { r .setLeadershipTransferInProgress (false ) }()
576+
573577 for r .getState () == Leader {
574578 select {
575579 case rpc := <- r .rpcCh :
@@ -644,7 +648,7 @@ func (r *Raft) leaderLoop() {
644648 doneCh <- fmt .Errorf ("cannot find replication state for %v" , id )
645649 continue
646650 }
647-
651+ r . setLeadershipTransferInProgress ( true )
648652 go r .leadershipTransfer (* id , * address , state , stopCh , doneCh )
649653
650654 case <- r .leaderState .commitCh :
@@ -847,10 +851,6 @@ func (r *Raft) leadershipTransfer(id ServerID, address ServerAddress, repl *foll
847851 default :
848852 }
849853
850- // Step 1: set this field which stops this leader from responding to any client requests.
851- r .setLeadershipTransferInProgress (true )
852- defer func () { r .setLeadershipTransferInProgress (false ) }()
853-
854854 for atomic .LoadUint64 (& repl .nextIndex ) <= r .getLastIndex () {
855855 err := & deferError {}
856856 err .init ()
@@ -1304,7 +1304,7 @@ func (r *Raft) appendEntries(rpc RPC, a *AppendEntriesRequest) {
13041304
13051305 // Increase the term if we see a newer one, also transition to follower
13061306 // if we ever get an appendEntries call
1307- if a .Term > r .getCurrentTerm () || r .getState () != Follower {
1307+ if a .Term > r .getCurrentTerm () || ( r .getState () != Follower && ! r . candidateFromLeadershipTransfer ) {
13081308 // Ensure transition to follower
13091309 r .setState (Follower )
13101310 r .setCurrentTerm (a .Term )
0 commit comments