diff --git a/.gitignore b/.gitignore index 88f3293fc..031b270ab 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ etcd *.swp /hack/insta-discovery/.env +*.test diff --git a/raft/node.go b/raft/node.go index b3d6bfdb5..23a4134b1 100644 --- a/raft/node.go +++ b/raft/node.go @@ -11,6 +11,8 @@ import ( var ( emptyState = pb.HardState{} + + // ErrStopped is returned by methods on Nodes that have been stopped. ErrStopped = errors.New("raft: stopped") ) @@ -68,10 +70,12 @@ func isHardStateEqual(a, b pb.HardState) bool { return a.Term == b.Term && a.Vote == b.Vote && a.Commit == b.Commit } +// IsEmptyHardState returns true if the given HardState is empty. func IsEmptyHardState(st pb.HardState) bool { return isHardStateEqual(st, emptyState) } +// IsEmptySnap returns true if the given Snapshot is empty. func IsEmptySnap(sp pb.Snapshot) bool { return sp.Index == 0 } @@ -81,6 +85,7 @@ func (rd Ready) containsUpdates() bool { len(rd.Entries) > 0 || len(rd.CommittedEntries) > 0 || len(rd.Messages) > 0 } +// Node represents a node in a raft cluster. type Node interface { // Tick increments the internal logical clock for the Node by a single tick. Election // timeouts and heartbeat timeouts are in units of ticks. diff --git a/raft/node_test.go b/raft/node_test.go index 3bf5c628b..6270acf3d 100644 --- a/raft/node_test.go +++ b/raft/node_test.go @@ -31,7 +31,7 @@ func TestNodeStep(t *testing.T) { if msgt == msgBeat || msgt == msgHup { select { case <-n.recvc: - t.Errorf("%d: step should ignore msgHub/msgBeat", i, mtmap[i]) + t.Errorf("%d: step should ignore %s", i, mtmap[i]) default: } } else { @@ -74,7 +74,7 @@ func TestNodeStepUnblock(t *testing.T) { select { case err := <-errc: if err != tt.werr { - t.Errorf("#%d: err = %v, want %v", err, tt.werr) + t.Errorf("#%d: err = %v, want %v", i, err, tt.werr) } //clean up side-effect if ctx.Err() != nil { diff --git a/raft/raft.go b/raft/raft.go index be2c5d56e..2917385f6 100644 --- a/raft/raft.go +++ b/raft/raft.go @@ -9,6 +9,7 @@ import ( pb "github.com/coreos/etcd/raft/raftpb" ) +// None is a placeholder node ID used when there is no leader. const None int64 = 0 type messageType int64 @@ -26,15 +27,15 @@ const ( ) var mtmap = [...]string{ - msgHup: "msgHup", - msgBeat: "msgBeat", - msgProp: "msgProp", - msgApp: "msgApp", - msgAppResp: "msgAppResp", - msgVote: "msgVote", - msgVoteResp: "msgVoteResp", - msgSnap: "msgSnap", - msgDenied: "msgDenied", + "msgHup", + "msgBeat", + "msgProp", + "msgApp", + "msgAppResp", + "msgVote", + "msgVoteResp", + "msgSnap", + "msgDenied", } func (mt messageType) String() string { @@ -43,18 +44,20 @@ func (mt messageType) String() string { var errNoLeader = errors.New("no leader") +// Possible values for StateType. const ( StateFollower StateType = iota StateCandidate StateLeader ) +// StateType represents the role of a node in a cluster. type StateType int64 var stmap = [...]string{ - StateFollower: "StateFollower", - StateCandidate: "StateCandidate", - StateLeader: "StateLeader", + "StateFollower", + "StateCandidate", + "StateLeader", } func (st StateType) String() string { diff --git a/raft/raft_test.go b/raft/raft_test.go index 57550838b..a9dfbad89 100644 --- a/raft/raft_test.go +++ b/raft/raft_test.go @@ -92,13 +92,13 @@ func TestLogReplication(t *testing.T) { t.Errorf("#%d.%d: committed = %d, want %d", i, j, sm.raftLog.committed, tt.wcommitted) } - ents := make([]pb.Entry, 0) + ents := []pb.Entry{} for _, e := range nextEnts(sm) { if e.Data != nil { ents = append(ents, e) } } - props := make([]pb.Message, 0) + props := []pb.Message{} for _, m := range tt.msgs { if m.Type == msgProp { props = append(props, m) @@ -651,7 +651,7 @@ func TestRecvMsgVote(t *testing.T) { continue } if g := msgs[0].Reject; g != tt.wreject { - t.Errorf("#%d, m.Reject = %d, want %d", i, g, tt.wreject) + t.Errorf("#%d, m.Reject = %v, want %v", i, g, tt.wreject) } } } @@ -1270,7 +1270,7 @@ func (nw *network) recover() { } func (nw *network) filter(msgs []pb.Message) []pb.Message { - mm := make([]pb.Message, 0) + mm := []pb.Message{} for _, m := range msgs { if nw.ignorem[m.Type] { continue