Browse Source

Merge pull request #1780 from xiang90/fix_raft_lead

raft: always check leader changes in node run loop
Xiang Li 11 years ago
parent
commit
e3cb3d640b
2 changed files with 13 additions and 11 deletions
  1. 11 11
      raft/node.go
  2. 2 0
      raft/raft.go

+ 11 - 11
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 {

+ 2 - 0
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()}
 }