Browse Source

raft: term -> State.Term

Blake Mizerany 11 years ago
parent
commit
c7e17e2f9e
2 changed files with 27 additions and 26 deletions
  1. 14 13
      raft2/raft.go
  2. 13 13
      raft2/raft_test.go

+ 14 - 13
raft2/raft.go

@@ -127,6 +127,8 @@ func (p int64Slice) Less(i, j int) bool { return p[i] < p[j] }
 func (p int64Slice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
 
 type raft struct {
+	State
+
 	// --- new stuff ---
 	name      string
 	election  int
@@ -137,7 +139,6 @@ type raft struct {
 	id        int64
 
 	// the term we are participating in at any time
-	term  atomicInt
 	index atomicInt
 
 	// who we voted for in term
@@ -187,7 +188,7 @@ func (r *raft) propose(data []byte) {
 }
 
 func (sm *raft) String() string {
-	s := fmt.Sprintf(`state=%v term=%d`, sm.state, sm.term)
+	s := fmt.Sprintf(`state=%v term=%d`, sm.state, sm.Term)
 	switch sm.state {
 	case stateFollower:
 		s += fmt.Sprintf(" vote=%v lead=%v", sm.vote, sm.lead)
@@ -215,7 +216,7 @@ func (sm *raft) poll(id int64, v bool) (granted int) {
 func (sm *raft) send(m Message) {
 	m.ClusterId = sm.clusterId
 	m.From = sm.id
-	m.Term = sm.term.Get()
+	m.Term = sm.Term
 	sm.msgs = append(sm.msgs, m)
 }
 
@@ -280,7 +281,7 @@ func (sm *raft) maybeCommit() bool {
 	sort.Sort(sort.Reverse(mis))
 	mci := mis[sm.q()-1]
 
-	return sm.raftLog.maybeCommit(mci, sm.term.Get())
+	return sm.raftLog.maybeCommit(mci, sm.Term)
 }
 
 // nextEnts returns the appliable entries and updates the applied index
@@ -308,7 +309,7 @@ func (sm *raft) q() int {
 }
 
 func (sm *raft) appendEntry(e Entry) {
-	e.Term = sm.term.Get()
+	e.Term = sm.Term
 	e.Index = sm.raftLog.lastIndex() + 1
 	sm.index.Set(sm.raftLog.append(sm.raftLog.lastIndex(), e))
 	sm.ins[sm.id].update(sm.raftLog.lastIndex())
@@ -327,7 +328,7 @@ func (sm *raft) becomeCandidate() {
 	if sm.state == stateLeader {
 		panic("invalid transition [leader -> candidate]")
 	}
-	sm.reset(sm.term.Get() + 1)
+	sm.reset(sm.Term + 1)
 	sm.setVote(sm.id)
 	sm.state = stateCandidate
 }
@@ -337,7 +338,7 @@ func (sm *raft) becomeLeader() {
 	if sm.state == stateFollower {
 		panic("invalid transition [follower -> leader]")
 	}
-	sm.reset(sm.term.Get())
+	sm.reset(sm.Term)
 	sm.lead.Set(sm.id)
 	sm.state = stateLeader
 
@@ -375,13 +376,13 @@ func (sm *raft) Step(m Message) error {
 	switch {
 	case m.Term == 0:
 		// local message
-	case m.Term > sm.term.Get():
+	case m.Term > sm.Term:
 		lead := m.From
 		if m.Type == msgVote {
 			lead = none
 		}
 		sm.becomeFollower(m.Term, lead)
-	case m.Term < sm.term.Get():
+	case m.Term < sm.Term:
 		// ignore
 	}
 
@@ -459,7 +460,7 @@ func stepCandidate(sm *raft, m Message) bool {
 	case msgProp:
 		return false
 	case msgApp:
-		sm.becomeFollower(sm.term.Get(), m.From)
+		sm.becomeFollower(sm.Term, m.From)
 		sm.handleAppendEntries(m)
 	case msgSnap:
 		sm.becomeFollower(m.Term, m.From)
@@ -473,7 +474,7 @@ func stepCandidate(sm *raft, m Message) bool {
 			sm.becomeLeader()
 			sm.bcastAppend()
 		case len(sm.votes) - gr:
-			sm.becomeFollower(sm.term.Get(), none)
+			sm.becomeFollower(sm.Term, none)
 		}
 	}
 	return true
@@ -548,7 +549,7 @@ func (sm *raft) nodes() []int64 {
 }
 
 func (sm *raft) setTerm(term int64) {
-	sm.term.Set(term)
+	sm.Term = term
 	sm.saveState()
 }
 
@@ -571,7 +572,7 @@ func (sm *raft) deleteIns(id int64) {
 // When there is a term change, vote change or configuration change, raft
 // must call saveState.
 func (sm *raft) saveState() {
-	sm.setState(sm.vote, sm.term.Get(), sm.raftLog.committed)
+	sm.setState(sm.vote, sm.Term, sm.raftLog.committed)
 }
 
 func (sm *raft) clearState() {

+ 13 - 13
raft2/raft_test.go

@@ -37,7 +37,7 @@ func TestLeaderElection(t *testing.T) {
 		if sm.state != tt.state {
 			t.Errorf("#%d: state = %s, want %s", i, sm.state, tt.state)
 		}
-		if g := sm.term.Get(); g != 1 {
+		if g := sm.Term; g != 1 {
 			t.Errorf("#%d: term = %d, want %d", i, g, 1)
 		}
 	}
@@ -230,7 +230,7 @@ func TestDuelingCandidates(t *testing.T) {
 		if g := tt.sm.state; g != tt.state {
 			t.Errorf("#%d: state = %s, want %s", i, g, tt.state)
 		}
-		if g := tt.sm.term.Get(); g != tt.term {
+		if g := tt.sm.Term; g != tt.term {
 			t.Errorf("#%d: term = %d, want %d", i, g, tt.term)
 		}
 		base := ltoa(tt.raftLog)
@@ -263,7 +263,7 @@ func TestCandidateConcede(t *testing.T) {
 	if g := a.state; g != stateFollower {
 		t.Errorf("state = %s, want %s", g, stateFollower)
 	}
-	if g := a.term; g != 1 {
+	if g := a.Term; g != 1 {
 		t.Errorf("term = %d, want %d", g, 1)
 	}
 	wantLog := ltoa(&raftLog{ents: []Entry{{}, {Type: Normal, Data: nil, Term: 1, Index: 1}, {Term: 1, Index: 2, Data: data}}, committed: 2})
@@ -369,7 +369,7 @@ func TestProposal(t *testing.T) {
 			}
 		}
 		sm := tt.network.peers[0].(*raft)
-		if g := sm.term.Get(); g != 1 {
+		if g := sm.Term; g != 1 {
 			t.Errorf("#%d: term = %d, want %d", i, g, 1)
 		}
 	}
@@ -402,7 +402,7 @@ func TestProposalByProxy(t *testing.T) {
 			}
 		}
 		sm := tt.peers[0].(*raft)
-		if g := sm.term.Get(); g != 1 {
+		if g := sm.Term; g != 1 {
 			t.Errorf("#%d: term = %d, want %d", i, g, 1)
 		}
 	}
@@ -441,7 +441,7 @@ func TestCommit(t *testing.T) {
 		for j := 0; j < len(tt.matches); j++ {
 			ins[int64(j)] = &index{tt.matches[j], tt.matches[j] + 1}
 		}
-		sm := &raft{raftLog: &raftLog{ents: tt.logs}, ins: ins, term: atomicInt(tt.smTerm)}
+		sm := &raft{raftLog: &raftLog{ents: tt.logs}, ins: ins, State: State{Term: tt.smTerm}}
 		sm.maybeCommit()
 		if g := sm.raftLog.committed; g != tt.w {
 			t.Errorf("#%d: committed = %d, want %d", i, g, tt.w)
@@ -480,7 +480,7 @@ func TestHandleMsgApp(t *testing.T) {
 	for i, tt := range tests {
 		sm := &raft{
 			state:   stateFollower,
-			term:    2,
+			State:   State{Term: 2},
 			raftLog: &raftLog{committed: 0, ents: []Entry{{}, {Term: 1}, {Term: 2}}},
 		}
 
@@ -602,8 +602,8 @@ func TestStateTransition(t *testing.T) {
 				sm.becomeLeader()
 			}
 
-			if sm.term.Get() != tt.wterm {
-				t.Errorf("%d: term = %d, want %d", i, sm.term.Get(), tt.wterm)
+			if sm.Term != tt.wterm {
+				t.Errorf("%d: term = %d, want %d", i, sm.Term, tt.wterm)
 			}
 			if sm.lead.Get() != tt.wlead {
 				t.Errorf("%d: lead = %d, want %d", i, sm.lead, tt.wlead)
@@ -694,8 +694,8 @@ func TestAllServerStepdown(t *testing.T) {
 			if sm.state != tt.wstate {
 				t.Errorf("#%d.%d state = %v , want %v", i, j, sm.state, tt.wstate)
 			}
-			if sm.term.Get() != tt.wterm {
-				t.Errorf("#%d.%d term = %v , want %v", i, j, sm.term.Get(), tt.wterm)
+			if sm.Term != tt.wterm {
+				t.Errorf("#%d.%d term = %v , want %v", i, j, sm.Term, tt.wterm)
 			}
 			if int64(len(sm.raftLog.ents)) != tt.windex {
 				t.Errorf("#%d.%d index = %v , want %v", i, j, len(sm.raftLog.ents), tt.windex)
@@ -730,7 +730,7 @@ func TestLeaderAppResp(t *testing.T) {
 		sm.becomeCandidate()
 		sm.becomeLeader()
 		sm.ReadMessages()
-		sm.Step(Message{From: 1, Type: msgAppResp, Index: tt.index, Term: sm.term.Get()})
+		sm.Step(Message{From: 1, Type: msgAppResp, Index: tt.index, Term: sm.Term})
 		msgs := sm.ReadMessages()
 
 		if len(msgs) != tt.wmsgNum {
@@ -762,7 +762,7 @@ func TestRecvMsgBeat(t *testing.T) {
 	for i, tt := range tests {
 		sm := newStateMachine(0, []int64{0, 1, 2})
 		sm.raftLog = &raftLog{ents: []Entry{{}, {Term: 0}, {Term: 1}}}
-		sm.term.Set(1)
+		sm.Term = 1
 		sm.state = tt.state
 		sm.Step(Message{From: 0, To: 0, Type: msgBeat})