main: check node id is not noneid

This commit is contained in:
Xiang Li 2014-09-14 22:44:59 -07:00
parent ed57a7b561
commit e7ea6a374a
3 changed files with 40 additions and 37 deletions

View File

@ -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)

View File

@ -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.lead = None
r.Vote = 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()})

View File

@ -537,25 +537,25 @@ func TestRecvMsgVote(t *testing.T) {
voteFor int64 voteFor int64
w int64 w int64
}{ }{
{stateFollower, 0, 0, none, -1}, {stateFollower, 0, 0, None, -1},
{stateFollower, 0, 1, none, -1}, {stateFollower, 0, 1, None, -1},
{stateFollower, 0, 2, none, -1}, {stateFollower, 0, 2, None, -1},
{stateFollower, 0, 3, none, 2}, {stateFollower, 0, 3, None, 2},
{stateFollower, 1, 0, none, -1}, {stateFollower, 1, 0, None, -1},
{stateFollower, 1, 1, none, -1}, {stateFollower, 1, 1, None, -1},
{stateFollower, 1, 2, none, -1}, {stateFollower, 1, 2, None, -1},
{stateFollower, 1, 3, none, 2}, {stateFollower, 1, 3, None, 2},
{stateFollower, 2, 0, none, -1}, {stateFollower, 2, 0, None, -1},
{stateFollower, 2, 1, none, -1}, {stateFollower, 2, 1, None, -1},
{stateFollower, 2, 2, none, 2}, {stateFollower, 2, 2, None, 2},
{stateFollower, 2, 3, none, 2}, {stateFollower, 2, 3, None, 2},
{stateFollower, 3, 0, none, -1}, {stateFollower, 3, 0, None, -1},
{stateFollower, 3, 1, none, -1}, {stateFollower, 3, 1, None, -1},
{stateFollower, 3, 2, none, 2}, {stateFollower, 3, 2, None, 2},
{stateFollower, 3, 3, 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, stateFollower, true, 1, None},
{stateFollower, stateCandidate, true, 1, none}, {stateFollower, stateCandidate, true, 1, None},
{stateFollower, stateLeader, false, -1, none}, {stateFollower, stateLeader, false, -1, None},
{stateCandidate, stateFollower, true, 0, none}, {stateCandidate, stateFollower, true, 0, None},
{stateCandidate, stateCandidate, true, 1, none}, {stateCandidate, stateCandidate, true, 1, None},
{stateCandidate, stateLeader, true, 0, 1}, {stateCandidate, stateLeader, true, 0, 1},
{stateLeader, stateFollower, true, 1, none}, {stateLeader, stateFollower, true, 1, None},
{stateLeader, stateCandidate, false, 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)
} }
} }
} }