raft: make raft configurable
This commit is contained in:
@ -262,7 +262,7 @@ func TestProgressResume(t *testing.T) {
|
||||
|
||||
// TestProgressResumeByHeartbeat ensures raft.heartbeat reset progress.paused by heartbeat.
|
||||
func TestProgressResumeByHeartbeat(t *testing.T) {
|
||||
r := newRaft(1, []uint64{1, 2}, 5, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(1, []uint64{1, 2}, 5, 1, NewMemoryStorage())
|
||||
r.becomeCandidate()
|
||||
r.becomeLeader()
|
||||
r.prs[2].Paused = true
|
||||
@ -274,7 +274,7 @@ func TestProgressResumeByHeartbeat(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestProgressPaused(t *testing.T) {
|
||||
r := newRaft(1, []uint64{1, 2}, 5, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(1, []uint64{1, 2}, 5, 1, NewMemoryStorage())
|
||||
r.becomeCandidate()
|
||||
r.becomeLeader()
|
||||
r.Step(pb.Message{From: 1, To: 1, Type: pb.MsgProp, Entries: []pb.Entry{{Data: []byte("somedata")}}})
|
||||
@ -466,9 +466,9 @@ func TestCommitWithoutNewTermEntry(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestDuelingCandidates(t *testing.T) {
|
||||
a := newRaft(1, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage(), 0)
|
||||
b := newRaft(2, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage(), 0)
|
||||
c := newRaft(3, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage(), 0)
|
||||
a := newTestRaft(1, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage())
|
||||
b := newTestRaft(2, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage())
|
||||
c := newTestRaft(3, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage())
|
||||
|
||||
nt := newNetwork(a, b, c)
|
||||
nt.cut(1, 3)
|
||||
@ -736,7 +736,7 @@ func TestCommit(t *testing.T) {
|
||||
storage.Append(tt.logs)
|
||||
storage.hardState = pb.HardState{Term: tt.smTerm}
|
||||
|
||||
sm := newRaft(1, []uint64{1}, 5, 1, storage, 0)
|
||||
sm := newTestRaft(1, []uint64{1}, 5, 1, storage)
|
||||
for j := 0; j < len(tt.matches); j++ {
|
||||
sm.setProgress(uint64(j)+1, tt.matches[j], tt.matches[j]+1)
|
||||
}
|
||||
@ -761,7 +761,7 @@ func TestIsElectionTimeout(t *testing.T) {
|
||||
}
|
||||
|
||||
for i, tt := range tests {
|
||||
sm := newRaft(1, []uint64{1}, 10, 1, NewMemoryStorage(), 0)
|
||||
sm := newTestRaft(1, []uint64{1}, 10, 1, NewMemoryStorage())
|
||||
sm.elapsed = tt.elapse
|
||||
c := 0
|
||||
for j := 0; j < 10000; j++ {
|
||||
@ -786,7 +786,7 @@ func TestStepIgnoreOldTermMsg(t *testing.T) {
|
||||
fakeStep := func(r *raft, m pb.Message) {
|
||||
called = true
|
||||
}
|
||||
sm := newRaft(1, []uint64{1}, 10, 1, NewMemoryStorage(), 0)
|
||||
sm := newTestRaft(1, []uint64{1}, 10, 1, NewMemoryStorage())
|
||||
sm.step = fakeStep
|
||||
sm.Term = 2
|
||||
sm.Step(pb.Message{Type: pb.MsgApp, Term: sm.Term - 1})
|
||||
@ -828,7 +828,7 @@ func TestHandleMsgApp(t *testing.T) {
|
||||
for i, tt := range tests {
|
||||
storage := NewMemoryStorage()
|
||||
storage.Append([]pb.Entry{{Index: 1, Term: 1}, {Index: 2, Term: 2}})
|
||||
sm := newRaft(1, []uint64{1}, 10, 1, storage, 0)
|
||||
sm := newTestRaft(1, []uint64{1}, 10, 1, storage)
|
||||
sm.becomeFollower(2, None)
|
||||
|
||||
sm.handleAppendEntries(tt.m)
|
||||
@ -862,7 +862,7 @@ func TestHandleHeartbeat(t *testing.T) {
|
||||
for i, tt := range tests {
|
||||
storage := NewMemoryStorage()
|
||||
storage.Append([]pb.Entry{{Index: 1, Term: 1}, {Index: 2, Term: 2}, {Index: 3, Term: 3}})
|
||||
sm := newRaft(1, []uint64{1, 2}, 5, 1, storage, 0)
|
||||
sm := newTestRaft(1, []uint64{1, 2}, 5, 1, storage)
|
||||
sm.becomeFollower(2, 2)
|
||||
sm.raftLog.commitTo(commit)
|
||||
sm.handleHeartbeat(tt.m)
|
||||
@ -883,7 +883,7 @@ func TestHandleHeartbeat(t *testing.T) {
|
||||
func TestHandleHeartbeatResp(t *testing.T) {
|
||||
storage := NewMemoryStorage()
|
||||
storage.Append([]pb.Entry{{Index: 1, Term: 1}, {Index: 2, Term: 2}, {Index: 3, Term: 3}})
|
||||
sm := newRaft(1, []uint64{1, 2}, 5, 1, storage, 0)
|
||||
sm := newTestRaft(1, []uint64{1, 2}, 5, 1, storage)
|
||||
sm.becomeCandidate()
|
||||
sm.becomeLeader()
|
||||
sm.raftLog.commitTo(sm.raftLog.lastIndex())
|
||||
@ -942,7 +942,7 @@ func TestHandleHeartbeatResp(t *testing.T) {
|
||||
// TestMsgAppRespWaitReset verifies the waitReset behavior of a leader
|
||||
// MsgAppResp.
|
||||
func TestMsgAppRespWaitReset(t *testing.T) {
|
||||
sm := newRaft(1, []uint64{1, 2, 3}, 5, 1, NewMemoryStorage(), 0)
|
||||
sm := newTestRaft(1, []uint64{1, 2, 3}, 5, 1, NewMemoryStorage())
|
||||
sm.becomeCandidate()
|
||||
sm.becomeLeader()
|
||||
|
||||
@ -1036,7 +1036,7 @@ func TestRecvMsgVote(t *testing.T) {
|
||||
}
|
||||
|
||||
for i, tt := range tests {
|
||||
sm := newRaft(1, []uint64{1}, 10, 1, NewMemoryStorage(), 0)
|
||||
sm := newTestRaft(1, []uint64{1}, 10, 1, NewMemoryStorage())
|
||||
sm.state = tt.state
|
||||
switch tt.state {
|
||||
case StateFollower:
|
||||
@ -1096,7 +1096,7 @@ func TestStateTransition(t *testing.T) {
|
||||
}
|
||||
}()
|
||||
|
||||
sm := newRaft(1, []uint64{1}, 10, 1, NewMemoryStorage(), 0)
|
||||
sm := newTestRaft(1, []uint64{1}, 10, 1, NewMemoryStorage())
|
||||
sm.state = tt.from
|
||||
|
||||
switch tt.to {
|
||||
@ -1135,7 +1135,7 @@ func TestAllServerStepdown(t *testing.T) {
|
||||
tterm := uint64(3)
|
||||
|
||||
for i, tt := range tests {
|
||||
sm := newRaft(1, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage(), 0)
|
||||
sm := newTestRaft(1, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage())
|
||||
switch tt.state {
|
||||
case StateFollower:
|
||||
sm.becomeFollower(1, None)
|
||||
@ -1194,7 +1194,7 @@ func TestLeaderAppResp(t *testing.T) {
|
||||
for i, tt := range tests {
|
||||
// sm term is 1 after it becomes the leader.
|
||||
// thus the last log term must be 1 to be committed.
|
||||
sm := newRaft(1, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage(), 0)
|
||||
sm := newTestRaft(1, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage())
|
||||
sm.raftLog = &raftLog{
|
||||
storage: &MemoryStorage{ents: []pb.Entry{{}, {Index: 1, Term: 0}, {Index: 2, Term: 1}}},
|
||||
unstable: unstable{offset: 3},
|
||||
@ -1242,7 +1242,7 @@ func TestBcastBeat(t *testing.T) {
|
||||
}
|
||||
storage := NewMemoryStorage()
|
||||
storage.ApplySnapshot(s)
|
||||
sm := newRaft(1, nil, 10, 1, storage, 0)
|
||||
sm := newTestRaft(1, nil, 10, 1, storage)
|
||||
sm.Term = 1
|
||||
|
||||
sm.becomeCandidate()
|
||||
@ -1301,7 +1301,7 @@ func TestRecvMsgBeat(t *testing.T) {
|
||||
}
|
||||
|
||||
for i, tt := range tests {
|
||||
sm := newRaft(1, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage(), 0)
|
||||
sm := newTestRaft(1, []uint64{1, 2, 3}, 10, 1, NewMemoryStorage())
|
||||
sm.raftLog = &raftLog{storage: &MemoryStorage{ents: []pb.Entry{{}, {Index: 1, Term: 0}, {Index: 2, Term: 1}}}}
|
||||
sm.Term = 1
|
||||
sm.state = tt.state
|
||||
@ -1344,7 +1344,7 @@ func TestLeaderIncreaseNext(t *testing.T) {
|
||||
}
|
||||
|
||||
for i, tt := range tests {
|
||||
sm := newRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage(), 0)
|
||||
sm := newTestRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage())
|
||||
sm.raftLog.append(previousEnts...)
|
||||
sm.becomeCandidate()
|
||||
sm.becomeLeader()
|
||||
@ -1360,7 +1360,7 @@ func TestLeaderIncreaseNext(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSendAppendForProgressProbe(t *testing.T) {
|
||||
r := newRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage())
|
||||
r.becomeCandidate()
|
||||
r.becomeLeader()
|
||||
r.readMessages()
|
||||
@ -1406,7 +1406,7 @@ func TestSendAppendForProgressProbe(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSendAppendForProgressReplicate(t *testing.T) {
|
||||
r := newRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage())
|
||||
r.becomeCandidate()
|
||||
r.becomeLeader()
|
||||
r.readMessages()
|
||||
@ -1423,7 +1423,7 @@ func TestSendAppendForProgressReplicate(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSendAppendForProgressSnapshot(t *testing.T) {
|
||||
r := newRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage())
|
||||
r.becomeCandidate()
|
||||
r.becomeLeader()
|
||||
r.readMessages()
|
||||
@ -1443,7 +1443,7 @@ func TestRecvMsgUnreachable(t *testing.T) {
|
||||
previousEnts := []pb.Entry{{Term: 1, Index: 1}, {Term: 1, Index: 2}, {Term: 1, Index: 3}}
|
||||
s := NewMemoryStorage()
|
||||
s.Append(previousEnts)
|
||||
r := newRaft(1, []uint64{1, 2}, 10, 1, s, 0)
|
||||
r := newTestRaft(1, []uint64{1, 2}, 10, 1, s)
|
||||
r.becomeCandidate()
|
||||
r.becomeLeader()
|
||||
r.readMessages()
|
||||
@ -1472,7 +1472,7 @@ func TestRestore(t *testing.T) {
|
||||
}
|
||||
|
||||
storage := NewMemoryStorage()
|
||||
sm := newRaft(1, []uint64{1, 2}, 10, 1, storage, 0)
|
||||
sm := newTestRaft(1, []uint64{1, 2}, 10, 1, storage)
|
||||
if ok := sm.restore(s); !ok {
|
||||
t.Fatal("restore fail, want succeed")
|
||||
}
|
||||
@ -1497,7 +1497,7 @@ func TestRestoreIgnoreSnapshot(t *testing.T) {
|
||||
previousEnts := []pb.Entry{{Term: 1, Index: 1}, {Term: 1, Index: 2}, {Term: 1, Index: 3}}
|
||||
commit := uint64(1)
|
||||
storage := NewMemoryStorage()
|
||||
sm := newRaft(1, []uint64{1, 2}, 10, 1, storage, 0)
|
||||
sm := newTestRaft(1, []uint64{1, 2}, 10, 1, storage)
|
||||
sm.raftLog.append(previousEnts...)
|
||||
sm.raftLog.commitTo(commit)
|
||||
|
||||
@ -1538,7 +1538,7 @@ func TestProvideSnap(t *testing.T) {
|
||||
},
|
||||
}
|
||||
storage := NewMemoryStorage()
|
||||
sm := newRaft(1, []uint64{1}, 10, 1, storage, 0)
|
||||
sm := newTestRaft(1, []uint64{1}, 10, 1, storage)
|
||||
sm.restore(s)
|
||||
|
||||
sm.becomeCandidate()
|
||||
@ -1569,7 +1569,7 @@ func TestRestoreFromSnapMsg(t *testing.T) {
|
||||
}
|
||||
m := pb.Message{Type: pb.MsgSnap, From: 1, Term: 2, Snapshot: s}
|
||||
|
||||
sm := newRaft(2, []uint64{1, 2}, 10, 1, NewMemoryStorage(), 0)
|
||||
sm := newTestRaft(2, []uint64{1, 2}, 10, 1, NewMemoryStorage())
|
||||
sm.Step(m)
|
||||
|
||||
// TODO(bdarnell): what should this test?
|
||||
@ -1604,7 +1604,7 @@ func TestSlowNodeRestore(t *testing.T) {
|
||||
// it appends the entry to log and sets pendingConf to be true.
|
||||
func TestStepConfig(t *testing.T) {
|
||||
// a raft that cannot make progress
|
||||
r := newRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage())
|
||||
r.becomeCandidate()
|
||||
r.becomeLeader()
|
||||
index := r.raftLog.lastIndex()
|
||||
@ -1622,7 +1622,7 @@ func TestStepConfig(t *testing.T) {
|
||||
// the proposal to noop and keep its original state.
|
||||
func TestStepIgnoreConfig(t *testing.T) {
|
||||
// a raft that cannot make progress
|
||||
r := newRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage())
|
||||
r.becomeCandidate()
|
||||
r.becomeLeader()
|
||||
r.Step(pb.Message{From: 1, To: 1, Type: pb.MsgProp, Entries: []pb.Entry{{Type: pb.EntryConfChange}}})
|
||||
@ -1649,7 +1649,7 @@ func TestRecoverPendingConfig(t *testing.T) {
|
||||
{pb.EntryConfChange, true},
|
||||
}
|
||||
for i, tt := range tests {
|
||||
r := newRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage())
|
||||
r.appendEntry(pb.Entry{Type: tt.entType})
|
||||
r.becomeCandidate()
|
||||
r.becomeLeader()
|
||||
@ -1668,7 +1668,7 @@ func TestRecoverDoublePendingConfig(t *testing.T) {
|
||||
t.Errorf("expect panic, but nothing happens")
|
||||
}
|
||||
}()
|
||||
r := newRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage())
|
||||
r.appendEntry(pb.Entry{Type: pb.EntryConfChange})
|
||||
r.appendEntry(pb.Entry{Type: pb.EntryConfChange})
|
||||
r.becomeCandidate()
|
||||
@ -1678,7 +1678,7 @@ func TestRecoverDoublePendingConfig(t *testing.T) {
|
||||
|
||||
// TestAddNode tests that addNode could update pendingConf and nodes correctly.
|
||||
func TestAddNode(t *testing.T) {
|
||||
r := newRaft(1, []uint64{1}, 10, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(1, []uint64{1}, 10, 1, NewMemoryStorage())
|
||||
r.pendingConf = true
|
||||
r.addNode(2)
|
||||
if r.pendingConf != false {
|
||||
@ -1694,7 +1694,7 @@ func TestAddNode(t *testing.T) {
|
||||
// TestRemoveNode tests that removeNode could update pendingConf, nodes and
|
||||
// and removed list correctly.
|
||||
func TestRemoveNode(t *testing.T) {
|
||||
r := newRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(1, []uint64{1, 2}, 10, 1, NewMemoryStorage())
|
||||
r.pendingConf = true
|
||||
r.removeNode(2)
|
||||
if r.pendingConf != false {
|
||||
@ -1718,7 +1718,7 @@ func TestPromotable(t *testing.T) {
|
||||
{[]uint64{2, 3}, false},
|
||||
}
|
||||
for i, tt := range tests {
|
||||
r := newRaft(id, tt.peers, 5, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(id, tt.peers, 5, 1, NewMemoryStorage())
|
||||
if g := r.promotable(); g != tt.wp {
|
||||
t.Errorf("#%d: promotable = %v, want %v", i, g, tt.wp)
|
||||
}
|
||||
@ -1740,7 +1740,7 @@ func TestRaftNodes(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for i, tt := range tests {
|
||||
r := newRaft(1, tt.ids, 10, 1, NewMemoryStorage(), 0)
|
||||
r := newTestRaft(1, tt.ids, 10, 1, NewMemoryStorage())
|
||||
if !reflect.DeepEqual(r.nodes(), tt.wids) {
|
||||
t.Errorf("#%d: nodes = %+v, want %+v", i, r.nodes(), tt.wids)
|
||||
}
|
||||
@ -1752,7 +1752,7 @@ func ents(terms ...uint64) *raft {
|
||||
for i, term := range terms {
|
||||
storage.Append([]pb.Entry{{Index: uint64(i + 1), Term: term}})
|
||||
}
|
||||
sm := newRaft(1, []uint64{}, 5, 1, storage, 0)
|
||||
sm := newTestRaft(1, []uint64{}, 5, 1, storage)
|
||||
sm.reset(0)
|
||||
return sm
|
||||
}
|
||||
@ -1780,7 +1780,7 @@ func newNetwork(peers ...Interface) *network {
|
||||
switch v := p.(type) {
|
||||
case nil:
|
||||
nstorage[id] = NewMemoryStorage()
|
||||
sm := newRaft(id, peerAddrs, 10, 1, nstorage[id], 0)
|
||||
sm := newTestRaft(id, peerAddrs, 10, 1, nstorage[id])
|
||||
npeers[id] = sm
|
||||
case *raft:
|
||||
v.id = id
|
||||
@ -1880,3 +1880,17 @@ func idsBySize(size int) []uint64 {
|
||||
}
|
||||
return ids
|
||||
}
|
||||
|
||||
func newTestRaft(id uint64, peers []uint64, election, heartbeat int, storage Storage) *raft {
|
||||
c := &Config{
|
||||
ID: id,
|
||||
Peers: peers,
|
||||
ElectionTick: election,
|
||||
HeartbeatTick: heartbeat,
|
||||
Storage: storage,
|
||||
MaxSizePerMsg: noLimit,
|
||||
MaxInflightMsgs: 256,
|
||||
}
|
||||
|
||||
return newRaft(c)
|
||||
}
|
||||
|
Reference in New Issue
Block a user