Skip to content

Commit d68b78b

Browse files
author
Dhia Ayachi
authored
Leadership transfer gaps (#487)
* setLeadershipTransferInProgress before starting the transfer go routine to avoid a race. * do not transition to follower state in a middle of a leadership transfer
1 parent 09ad89e commit d68b78b

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

raft.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)