Skip to content

Commit

Permalink
[IMPROVED] Leadership transfer (#4145)
Browse files Browse the repository at this point in the history
When doing leadership transfer stepdown as soon as we know we have sent
the EntryLeaderTransfer entry.

Delaying could allow something to be sent from the old leader which
would cause the new leader to bail on being a candidate even though it
would have gotten all the votes.

Signed-off-by: Derek Collison <derek@nats.io>
  • Loading branch information
derekcollison committed May 10, 2023
2 parents 7248560 + a17357c commit 81bf92b
Showing 1 changed file with 9 additions and 9 deletions.
18 changes: 9 additions & 9 deletions server/raft.go
Expand Up @@ -1368,15 +1368,6 @@ func (n *raft) StepDown(preferred ...string) error {
if maybeLeader != noLeader {
n.debug("Selected %q for new leader", maybeLeader)
prop.push(newEntry(EntryLeaderTransfer, []byte(maybeLeader)))
time.AfterFunc(250*time.Millisecond, func() {
n.RLock()
stillLeader := n.state == Leader
n.RUnlock()
// If we are still the leader force a stepdown.
if stillLeader {
stepdown.push(noLeader)
}
})
} else {
// Force us to stepdown here.
n.debug("Stepping down")
Expand Down Expand Up @@ -2234,11 +2225,20 @@ func (n *raft) runAsLeader() {
continue
}
n.sendAppendEntry(entries)

// If this is us sending out a leadership transfer stepdown inline here.
if b.Type == EntryLeaderTransfer {
n.prop.recycle(&es)
n.debug("Stepping down due to leadership transfer")
n.switchToFollower(noLeader)
return
}
// We need to re-create `entries` because there is a reference
// to it in the node's pae map.
entries = nil
}
n.prop.recycle(&es)

case <-hb.C:
if n.notActive() {
n.sendHeartbeat()
Expand Down

0 comments on commit 81bf92b

Please sign in to comment.