mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #1134 from jonboulle/1134_flaky_test
flaky test TestSyncTriggerDeleteExpriedKeys
This commit is contained in:
commit
f34e37f68f
@ -446,30 +446,54 @@ func TestSyncTimeout(t *testing.T) {
|
|||||||
|
|
||||||
// TODO: TestNoSyncWhenNoLeader
|
// TODO: TestNoSyncWhenNoLeader
|
||||||
|
|
||||||
func TestSyncTriggerDeleteExpriedKeys(t *testing.T) {
|
// blockingNodeProposer implements the node interface to allow users to
|
||||||
n := raft.StartNode(0xBAD0, []int64{0xBAD0}, 10, 1)
|
// block until Propose has been called and then verify the Proposed data
|
||||||
n.Campaign(context.TODO())
|
type blockingNodeProposer struct {
|
||||||
st := &storeRecorder{}
|
ch chan []byte
|
||||||
|
readyNode
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *blockingNodeProposer) Propose(_ context.Context, data []byte) error {
|
||||||
|
n.ch <- data
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestSyncTrigger tests that the server proposes a SYNC request when its sync timer ticks
|
||||||
|
func TestSyncTrigger(t *testing.T) {
|
||||||
|
n := &blockingNodeProposer{
|
||||||
|
ch: make(chan []byte),
|
||||||
|
readyNode: *newReadyNode(),
|
||||||
|
}
|
||||||
|
st := make(chan time.Time, 1)
|
||||||
srv := &EtcdServer{
|
srv := &EtcdServer{
|
||||||
// TODO: use fake node for better testability
|
|
||||||
Node: n,
|
Node: n,
|
||||||
Store: st,
|
Store: &storeRecorder{},
|
||||||
Send: func(_ []raftpb.Message) {},
|
Send: func(_ []raftpb.Message) {},
|
||||||
Storage: &storageRecorder{},
|
Storage: &storageRecorder{},
|
||||||
SyncTicker: time.After(0),
|
SyncTicker: st,
|
||||||
}
|
}
|
||||||
srv.Start()
|
srv.Start()
|
||||||
// give time for sync request to be proposed and performed
|
// trigger the server to become a leader and accept sync requests
|
||||||
// TODO: use fake clock
|
n.readyc <- raft.Ready{
|
||||||
testutil.ForceGosched()
|
SoftState: &raft.SoftState{
|
||||||
srv.Stop()
|
RaftState: raft.StateLeader,
|
||||||
|
},
|
||||||
action := st.Action()
|
|
||||||
if len(action) != 1 {
|
|
||||||
t.Fatalf("len(action) = %d, want 1", len(action))
|
|
||||||
}
|
}
|
||||||
if action[0] != "DeleteExpiredKeys" {
|
// trigger a sync request
|
||||||
t.Errorf("action = %s, want DeleteExpiredKeys", action[0])
|
st <- time.Time{}
|
||||||
|
var data []byte
|
||||||
|
select {
|
||||||
|
case <-time.After(time.Second):
|
||||||
|
t.Fatalf("did not receive proposed request as expected!")
|
||||||
|
case data = <-n.ch:
|
||||||
|
}
|
||||||
|
srv.Stop()
|
||||||
|
var req pb.Request
|
||||||
|
if err := req.Unmarshal(data); err != nil {
|
||||||
|
t.Fatalf("error unmarshalling data: %v", err)
|
||||||
|
}
|
||||||
|
if req.Method != "SYNC" {
|
||||||
|
t.Fatalf("unexpected proposed request: %#v", req.Method)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user