Browse Source

raft: Step returns ok

Blake Mizerany 11 years ago
parent
commit
e5b9e22518
3 changed files with 18 additions and 14 deletions
  1. 6 3
      raft/node.go
  2. 10 9
      raft/raft.go
  3. 2 2
      raft/raft_test.go

+ 6 - 3
raft/node.go

@@ -6,7 +6,7 @@ import (
 )
 )
 
 
 type Interface interface {
 type Interface interface {
-	Step(m Message)
+	Step(m Message) bool
 	Msgs() []Message
 	Msgs() []Message
 }
 }
 
 
@@ -60,9 +60,11 @@ func (n *Node) Remove(id int) { n.updateConf(configRemove, &config{NodeId: id})
 
 
 func (n *Node) Msgs() []Message { return n.sm.Msgs() }
 func (n *Node) Msgs() []Message { return n.sm.Msgs() }
 
 
-func (n *Node) Step(m Message) {
+func (n *Node) Step(m Message) bool {
 	l := len(n.sm.msgs)
 	l := len(n.sm.msgs)
-	n.sm.Step(m)
+	if !n.sm.Step(m) {
+		return false
+	}
 	for _, m := range n.sm.msgs[l:] {
 	for _, m := range n.sm.msgs[l:] {
 		// reset elapsed in two cases:
 		// reset elapsed in two cases:
 		// msgAppResp -> heard from the leader of the same term
 		// msgAppResp -> heard from the leader of the same term
@@ -76,6 +78,7 @@ func (n *Node) Step(m Message) {
 			}
 			}
 		}
 		}
 	}
 	}
+	return true
 }
 }
 
 
 // Next returns all the appliable entries
 // Next returns all the appliable entries

+ 10 - 9
raft/raft.go

@@ -240,13 +240,13 @@ func (sm *stateMachine) Msgs() []Message {
 	return msgs
 	return msgs
 }
 }
 
 
-func (sm *stateMachine) Step(m Message) {
+func (sm *stateMachine) Step(m Message) (ok bool) {
 	switch m.Type {
 	switch m.Type {
 	case msgHup:
 	case msgHup:
 		sm.becomeCandidate()
 		sm.becomeCandidate()
 		if sm.q() == sm.poll(sm.id, true) {
 		if sm.q() == sm.poll(sm.id, true) {
 			sm.becomeLeader()
 			sm.becomeLeader()
-			return
+			return true
 		}
 		}
 		for i := range sm.ins {
 		for i := range sm.ins {
 			if i == sm.id {
 			if i == sm.id {
@@ -255,10 +255,10 @@ func (sm *stateMachine) Step(m Message) {
 			lasti := sm.log.lastIndex()
 			lasti := sm.log.lastIndex()
 			sm.send(Message{To: i, Type: msgVote, Index: lasti, LogTerm: sm.log.term(lasti)})
 			sm.send(Message{To: i, Type: msgVote, Index: lasti, LogTerm: sm.log.term(lasti)})
 		}
 		}
-		return
+		return true
 	case msgBeat:
 	case msgBeat:
 		if sm.state != stateLeader {
 		if sm.state != stateLeader {
-			return
+			return true
 		}
 		}
 		sm.bcastAppend()
 		sm.bcastAppend()
 		return
 		return
@@ -272,8 +272,7 @@ func (sm *stateMachine) Step(m Message) {
 			e := m.Entries[0]
 			e := m.Entries[0]
 			if e.Type == configAdd || e.Type == configRemove {
 			if e.Type == configAdd || e.Type == configRemove {
 				if sm.pendingConf {
 				if sm.pendingConf {
-					// todo: deny
-					return
+					return false
 				}
 				}
 				sm.pendingConf = true
 				sm.pendingConf = true
 			}
 			}
@@ -284,12 +283,13 @@ func (sm *stateMachine) Step(m Message) {
 			sm.maybeCommit()
 			sm.maybeCommit()
 			sm.bcastAppend()
 			sm.bcastAppend()
 		case none:
 		case none:
-			panic("msgProp given without leader")
+			// msgProp given without leader
+			return false
 		default:
 		default:
 			m.To = sm.lead
 			m.To = sm.lead
 			sm.send(m)
 			sm.send(m)
 		}
 		}
-		return
+		return true
 	}
 	}
 
 
 	switch {
 	switch {
@@ -297,7 +297,7 @@ func (sm *stateMachine) Step(m Message) {
 		sm.becomeFollower(m.Term, m.From)
 		sm.becomeFollower(m.Term, m.From)
 	case m.Term < sm.term:
 	case m.Term < sm.term:
 		// ignore
 		// ignore
-		return
+		return true
 	}
 	}
 
 
 	handleAppendEntries := func() {
 	handleAppendEntries := func() {
@@ -354,6 +354,7 @@ func (sm *stateMachine) Step(m Message) {
 			}
 			}
 		}
 		}
 	}
 	}
+	return true
 }
 }
 
 
 func (sm *stateMachine) add(id int) {
 func (sm *stateMachine) add(id int) {

+ 2 - 2
raft/raft_test.go

@@ -742,7 +742,7 @@ type connem struct {
 
 
 type blackHole struct{}
 type blackHole struct{}
 
 
-func (blackHole) Step(Message)    {}
-func (blackHole) Msgs() []Message { return nil }
+func (blackHole) Step(Message) bool { return true }
+func (blackHole) Msgs() []Message   { return nil }
 
 
 var nopStepper = &blackHole{}
 var nopStepper = &blackHole{}