etcdserver, test: don't access testing.T in time.AfterFunc()'s own goroutine
time.AfterFunc() creates its own goroutine and calls the callback
function in the goroutine. It can cause datarace like the problem
fixed in the commit de1a16e0f1
. This
commit also fixes the potential dataraces of tests in
etcdserver/server_test.go .
This commit is contained in:
@ -604,11 +604,18 @@ func TestSync(t *testing.T) {
|
||||
reqIDGen: idutil.NewGenerator(0, time.Time{}),
|
||||
}
|
||||
// check that sync is non-blocking
|
||||
timer := time.AfterFunc(time.Second, func() {
|
||||
t.Fatalf("sync should be non-blocking but did not return after 1s!")
|
||||
})
|
||||
done := make(chan struct{})
|
||||
go func() {
|
||||
srv.sync(10 * time.Second)
|
||||
timer.Stop()
|
||||
done <- struct{}{}
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-done:
|
||||
case <-time.After(time.Second):
|
||||
t.Fatal("sync should be non-blocking but did not return after 1s!")
|
||||
}
|
||||
|
||||
testutil.WaitSchedule()
|
||||
|
||||
action := n.Action()
|
||||
@ -637,11 +644,17 @@ func TestSyncTimeout(t *testing.T) {
|
||||
reqIDGen: idutil.NewGenerator(0, time.Time{}),
|
||||
}
|
||||
// check that sync is non-blocking
|
||||
timer := time.AfterFunc(time.Second, func() {
|
||||
t.Fatalf("sync should be non-blocking but did not return after 1s!")
|
||||
})
|
||||
done := make(chan struct{})
|
||||
go func() {
|
||||
srv.sync(0)
|
||||
timer.Stop()
|
||||
done <- struct{}{}
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-done:
|
||||
case <-time.After(time.Second):
|
||||
t.Fatal("sync should be non-blocking but did not return after 1s!")
|
||||
}
|
||||
|
||||
// give time for goroutine in sync to cancel
|
||||
testutil.WaitSchedule()
|
||||
|
Reference in New Issue
Block a user