Merge pull request #1780 from xiang90/fix_raft_lead

raft: always check leader changes in node run loop
This commit is contained in:
Xiang Li 2014-11-24 19:29:53 -08:00
commit e3cb3d640b
2 changed files with 13 additions and 11 deletions

View File

@ -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 {

View File

@ -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()}
}