From 945511996839cd8f1849ff6fb2806f4b4146f683 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Mon, 24 Nov 2014 19:07:10 -0800 Subject: [PATCH] raft: always check leader changes in node run loop --- raft/node.go | 22 +++++++++++----------- raft/raft.go | 2 ++ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/raft/node.go b/raft/node.go index 2e5b1dd8d..e870106aa 100644 --- a/raft/node.go +++ b/raft/node.go @@ -245,21 +245,21 @@ func (n *node) run(r *raft) { } else { readyc = nil } + } - if rd.SoftState != nil && lead != rd.SoftState.Lead { - if r.hasLeader() { - if lead == None { - log.Printf("raft: elected leader %x at term %d", rd.SoftState.Lead, r.Term) - } else { - log.Printf("raft: leader changed from %x to %x at term %d", lead, rd.SoftState.Lead, r.Term) - } - propc = n.propc + if lead != r.leader() { + if r.hasLeader() { + if lead == None { + log.Printf("raft: elected leader %x at term %d", r.leader(), r.Term) } else { - log.Printf("raft: lost leader %x at term %d", lead, r.Term) - propc = nil + log.Printf("raft: leader changed from %x to %x at term %d", lead, r.leader(), r.Term) } - lead = rd.SoftState.Lead + propc = n.propc + } else { + log.Printf("raft: lost leader %x at term %d", lead, r.Term) + propc = nil } + lead = r.leader() } select { diff --git a/raft/raft.go b/raft/raft.go index 04b4ac97a..1d9b28ac5 100644 --- a/raft/raft.go +++ b/raft/raft.go @@ -159,6 +159,8 @@ func newRaft(id uint64, peers []uint64, election, heartbeat int) *raft { func (r *raft) hasLeader() bool { return r.lead != None } +func (r *raft) leader() uint64 { return r.lead } + func (r *raft) softState() *SoftState { return &SoftState{Lead: r.lead, RaftState: r.state, Nodes: r.nodes()} }