From e7ea6a374abb85bd7a31a8b355a204c0205e1c4a Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Sun, 14 Sep 2014 22:44:59 -0700 Subject: [PATCH] main: check node id is not noneid --- main.go | 3 +++ raft/raft.go | 22 ++++++++++---------- raft/raft_test.go | 52 +++++++++++++++++++++++------------------------ 3 files changed, 40 insertions(+), 37 deletions(-) diff --git a/main.go b/main.go index 368251353..bcb174ae4 100644 --- a/main.go +++ b/main.go @@ -57,6 +57,9 @@ func startEtcd() http.Handler { if err != nil { log.Fatal(err) } + if id == raft.None { + log.Fatalf("etcd: cannot use None(%d) as etcdserver id", raft.None) + } if peers.Pick(id) == "" { log.Fatalf("%#x= must be specified in peers", id) diff --git a/raft/raft.go b/raft/raft.go index e8aa88cfe..56d6a057e 100644 --- a/raft/raft.go +++ b/raft/raft.go @@ -8,7 +8,7 @@ import ( pb "github.com/coreos/etcd/raft/raftpb" ) -const none = 0 +const None = 0 type messageType int64 @@ -113,12 +113,12 @@ type raft struct { } func newRaft(id int64, peers []int64, election, heartbeat int) *raft { - if id == none { + if id == None { panic("cannot use none id") } r := &raft{ id: id, - lead: none, + lead: None, raftLog: newLog(), prs: make(map[int64]*progress), electionTimeout: election, @@ -127,11 +127,11 @@ func newRaft(id int64, peers []int64, election, heartbeat int) *raft { for _, p := range peers { r.prs[p] = &progress{} } - r.becomeFollower(0, none) + r.becomeFollower(0, None) 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 { 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) { r.Term = term - r.lead = none - r.Vote = none + r.lead = None + r.Vote = None r.elapsed = 0 r.votes = make(map[int64]bool) for i := range r.prs { @@ -342,7 +342,7 @@ func (r *raft) Step(m pb.Message) error { case m.Term > r.Term: lead := m.From if m.Type == msgVote { - lead = none + lead = None } r.becomeFollower(m.Term, lead) case m.Term < r.Term: @@ -417,7 +417,7 @@ func stepCandidate(r *raft, m pb.Message) { r.becomeLeader() r.bcastAppend() 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) { switch m.Type { case msgProp: - if r.lead == none { + if r.lead == None { panic("no leader") } m.To = r.lead @@ -438,7 +438,7 @@ func stepFollower(r *raft, m pb.Message) { r.elapsed = 0 r.handleSnapshot(m) 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.Vote = m.From r.send(pb.Message{To: m.From, Type: msgVoteResp, Index: r.raftLog.lastIndex()}) diff --git a/raft/raft_test.go b/raft/raft_test.go index f435bd384..483a83d6a 100644 --- a/raft/raft_test.go +++ b/raft/raft_test.go @@ -537,25 +537,25 @@ func TestRecvMsgVote(t *testing.T) { voteFor int64 w int64 }{ - {stateFollower, 0, 0, none, -1}, - {stateFollower, 0, 1, none, -1}, - {stateFollower, 0, 2, none, -1}, - {stateFollower, 0, 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, 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, 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, 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, 1, -1}, @@ -599,16 +599,16 @@ func TestStateTransition(t *testing.T) { wterm 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}, - {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}, } @@ -664,7 +664,7 @@ func TestAllServerStepdown(t *testing.T) { sm := newRaft(1, []int64{1, 2, 3}, 0, 0) switch tt.state { case stateFollower: - sm.becomeFollower(1, none) + sm.becomeFollower(1, None) case stateCandidate: sm.becomeCandidate() case stateLeader: @@ -686,10 +686,10 @@ func TestAllServerStepdown(t *testing.T) { } wlead := int64(2) if msgType == msgVote { - wlead = none + wlead = None } 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) } } }