Browse Source

Merge pull request #1080 from coreos/check_id

main: check node id is not noneid
Xiang Li 11 years ago
parent
commit
29f9372370
3 changed files with 43 additions and 40 deletions
  1. 3 0
      main.go
  2. 11 11
      raft/raft.go
  3. 29 29
      raft/raft_test.go

+ 3 - 0
main.go

@@ -57,6 +57,9 @@ func startEtcd() http.Handler {
 	if err != nil {
 	if err != nil {
 		log.Fatal(err)
 		log.Fatal(err)
 	}
 	}
+	if id == raft.None {
+		log.Fatalf("etcd: cannot use None(%d) as etcdserver id", raft.None)
+	}
 
 
 	if peers.Pick(id) == "" {
 	if peers.Pick(id) == "" {
 		log.Fatalf("%#x=<addr> must be specified in peers", id)
 		log.Fatalf("%#x=<addr> must be specified in peers", id)

+ 11 - 11
raft/raft.go

@@ -8,7 +8,7 @@ import (
 	pb "github.com/coreos/etcd/raft/raftpb"
 	pb "github.com/coreos/etcd/raft/raftpb"
 )
 )
 
 
-const none = 0
+const None = 0
 
 
 type messageType int64
 type messageType int64
 
 
@@ -113,12 +113,12 @@ type raft struct {
 }
 }
 
 
 func newRaft(id int64, peers []int64, election, heartbeat int) *raft {
 func newRaft(id int64, peers []int64, election, heartbeat int) *raft {
-	if id == none {
+	if id == None {
 		panic("cannot use none id")
 		panic("cannot use none id")
 	}
 	}
 	r := &raft{
 	r := &raft{
 		id:               id,
 		id:               id,
-		lead:             none,
+		lead:             None,
 		raftLog:          newLog(),
 		raftLog:          newLog(),
 		prs:              make(map[int64]*progress),
 		prs:              make(map[int64]*progress),
 		electionTimeout:  election,
 		electionTimeout:  election,
@@ -127,11 +127,11 @@ func newRaft(id int64, peers []int64, election, heartbeat int) *raft {
 	for _, p := range peers {
 	for _, p := range peers {
 		r.prs[p] = &progress{}
 		r.prs[p] = &progress{}
 	}
 	}
-	r.becomeFollower(0, none)
+	r.becomeFollower(0, None)
 	return r
 	return r
 }
 }
 
 
-func (r *raft) hasLeader() bool { return r.lead != none }
+func (r *raft) hasLeader() bool { return r.lead != None }
 
 
 func (r *raft) String() string {
 func (r *raft) String() string {
 	s := fmt.Sprintf(`state=%v term=%d`, r.state, r.Term)
 	s := fmt.Sprintf(`state=%v term=%d`, r.state, r.Term)
@@ -231,8 +231,8 @@ func (r *raft) maybeCommit() bool {
 
 
 func (r *raft) reset(term int64) {
 func (r *raft) reset(term int64) {
 	r.Term = term
 	r.Term = term
-	r.lead = none
-	r.Vote = none
+	r.lead = None
+	r.Vote = None
 	r.elapsed = 0
 	r.elapsed = 0
 	r.votes = make(map[int64]bool)
 	r.votes = make(map[int64]bool)
 	for i := range r.prs {
 	for i := range r.prs {
@@ -342,7 +342,7 @@ func (r *raft) Step(m pb.Message) error {
 	case m.Term > r.Term:
 	case m.Term > r.Term:
 		lead := m.From
 		lead := m.From
 		if m.Type == msgVote {
 		if m.Type == msgVote {
-			lead = none
+			lead = None
 		}
 		}
 		r.becomeFollower(m.Term, lead)
 		r.becomeFollower(m.Term, lead)
 	case m.Term < r.Term:
 	case m.Term < r.Term:
@@ -417,7 +417,7 @@ func stepCandidate(r *raft, m pb.Message) {
 			r.becomeLeader()
 			r.becomeLeader()
 			r.bcastAppend()
 			r.bcastAppend()
 		case len(r.votes) - gr:
 		case len(r.votes) - gr:
-			r.becomeFollower(r.Term, none)
+			r.becomeFollower(r.Term, None)
 		}
 		}
 	}
 	}
 }
 }
@@ -425,7 +425,7 @@ func stepCandidate(r *raft, m pb.Message) {
 func stepFollower(r *raft, m pb.Message) {
 func stepFollower(r *raft, m pb.Message) {
 	switch m.Type {
 	switch m.Type {
 	case msgProp:
 	case msgProp:
-		if r.lead == none {
+		if r.lead == None {
 			panic("no leader")
 			panic("no leader")
 		}
 		}
 		m.To = r.lead
 		m.To = r.lead
@@ -438,7 +438,7 @@ func stepFollower(r *raft, m pb.Message) {
 		r.elapsed = 0
 		r.elapsed = 0
 		r.handleSnapshot(m)
 		r.handleSnapshot(m)
 	case msgVote:
 	case msgVote:
-		if (r.Vote == none || r.Vote == m.From) && r.raftLog.isUpToDate(m.Index, m.LogTerm) {
+		if (r.Vote == None || r.Vote == m.From) && r.raftLog.isUpToDate(m.Index, m.LogTerm) {
 			r.elapsed = 0
 			r.elapsed = 0
 			r.Vote = m.From
 			r.Vote = m.From
 			r.send(pb.Message{To: m.From, Type: msgVoteResp, Index: r.raftLog.lastIndex()})
 			r.send(pb.Message{To: m.From, Type: msgVoteResp, Index: r.raftLog.lastIndex()})

+ 29 - 29
raft/raft_test.go

@@ -537,25 +537,25 @@ func TestRecvMsgVote(t *testing.T) {
 		voteFor int64
 		voteFor int64
 		w       int64
 		w       int64
 	}{
 	}{
-		{stateFollower, 0, 0, none, -1},
-		{stateFollower, 0, 1, none, -1},
-		{stateFollower, 0, 2, none, -1},
-		{stateFollower, 0, 3, none, 2},
-
-		{stateFollower, 1, 0, none, -1},
-		{stateFollower, 1, 1, none, -1},
-		{stateFollower, 1, 2, none, -1},
-		{stateFollower, 1, 3, none, 2},
-
-		{stateFollower, 2, 0, none, -1},
-		{stateFollower, 2, 1, none, -1},
-		{stateFollower, 2, 2, none, 2},
-		{stateFollower, 2, 3, none, 2},
-
-		{stateFollower, 3, 0, none, -1},
-		{stateFollower, 3, 1, none, -1},
-		{stateFollower, 3, 2, none, 2},
-		{stateFollower, 3, 3, none, 2},
+		{stateFollower, 0, 0, None, -1},
+		{stateFollower, 0, 1, None, -1},
+		{stateFollower, 0, 2, None, -1},
+		{stateFollower, 0, 3, None, 2},
+
+		{stateFollower, 1, 0, None, -1},
+		{stateFollower, 1, 1, None, -1},
+		{stateFollower, 1, 2, None, -1},
+		{stateFollower, 1, 3, None, 2},
+
+		{stateFollower, 2, 0, None, -1},
+		{stateFollower, 2, 1, None, -1},
+		{stateFollower, 2, 2, None, 2},
+		{stateFollower, 2, 3, None, 2},
+
+		{stateFollower, 3, 0, None, -1},
+		{stateFollower, 3, 1, None, -1},
+		{stateFollower, 3, 2, None, 2},
+		{stateFollower, 3, 3, None, 2},
 
 
 		{stateFollower, 3, 2, 2, 2},
 		{stateFollower, 3, 2, 2, 2},
 		{stateFollower, 3, 2, 1, -1},
 		{stateFollower, 3, 2, 1, -1},
@@ -599,16 +599,16 @@ func TestStateTransition(t *testing.T) {
 		wterm  int64
 		wterm  int64
 		wlead  int64
 		wlead  int64
 	}{
 	}{
-		{stateFollower, stateFollower, true, 1, none},
-		{stateFollower, stateCandidate, true, 1, none},
-		{stateFollower, stateLeader, false, -1, none},
+		{stateFollower, stateFollower, true, 1, None},
+		{stateFollower, stateCandidate, true, 1, None},
+		{stateFollower, stateLeader, false, -1, None},
 
 
-		{stateCandidate, stateFollower, true, 0, none},
-		{stateCandidate, stateCandidate, true, 1, none},
+		{stateCandidate, stateFollower, true, 0, None},
+		{stateCandidate, stateCandidate, true, 1, None},
 		{stateCandidate, stateLeader, true, 0, 1},
 		{stateCandidate, stateLeader, true, 0, 1},
 
 
-		{stateLeader, stateFollower, true, 1, none},
-		{stateLeader, stateCandidate, false, 1, none},
+		{stateLeader, stateFollower, true, 1, None},
+		{stateLeader, stateCandidate, false, 1, None},
 		{stateLeader, stateLeader, true, 0, 1},
 		{stateLeader, stateLeader, true, 0, 1},
 	}
 	}
 
 
@@ -664,7 +664,7 @@ func TestAllServerStepdown(t *testing.T) {
 		sm := newRaft(1, []int64{1, 2, 3}, 0, 0)
 		sm := newRaft(1, []int64{1, 2, 3}, 0, 0)
 		switch tt.state {
 		switch tt.state {
 		case stateFollower:
 		case stateFollower:
-			sm.becomeFollower(1, none)
+			sm.becomeFollower(1, None)
 		case stateCandidate:
 		case stateCandidate:
 			sm.becomeCandidate()
 			sm.becomeCandidate()
 		case stateLeader:
 		case stateLeader:
@@ -686,10 +686,10 @@ func TestAllServerStepdown(t *testing.T) {
 			}
 			}
 			wlead := int64(2)
 			wlead := int64(2)
 			if msgType == msgVote {
 			if msgType == msgVote {
-				wlead = none
+				wlead = None
 			}
 			}
 			if sm.lead != wlead {
 			if sm.lead != wlead {
-				t.Errorf("#%d, sm.lead = %d, want %d", i, sm.lead, none)
+				t.Errorf("#%d, sm.lead = %d, want %d", i, sm.lead, None)
 			}
 			}
 		}
 		}
 	}
 	}