Merge pull request #1080 from coreos/check_id

main: check node id is not noneid
release-2.0
Xiang Li 2014-09-14 23:28:39 -07:00
commit 29f9372370
3 changed files with 40 additions and 37 deletions

View File

@ -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=<addr> must be specified in peers", id)

View File

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

View File

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