mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #1780 from xiang90/fix_raft_lead
raft: always check leader changes in node run loop
This commit is contained in:
commit
e3cb3d640b
22
raft/node.go
22
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 {
|
||||
|
@ -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()}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user