From c6d934a685c1a8d6f486765421d278552cb3cd23 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Mon, 9 May 2016 20:41:55 +0200 Subject: [PATCH 1/2] Fix flaky worker cancel test --- src/restic/worker/pool_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/restic/worker/pool_test.go b/src/restic/worker/pool_test.go index 16b285702..5c7ca91e4 100644 --- a/src/restic/worker/pool_test.go +++ b/src/restic/worker/pool_test.go @@ -94,7 +94,6 @@ var errCancelled = errors.New("cancelled") type Job struct { suc chan struct{} - d time.Duration } func wait(job worker.Job, done <-chan struct{}) (interface{}, error) { @@ -102,8 +101,6 @@ func wait(job worker.Job, done <-chan struct{}) (interface{}, error) { select { case j.suc <- struct{}{}: return time.Now(), nil - case <-time.After(j.d): - return time.Now(), nil case <-done: return nil, errCancelled } @@ -114,7 +111,7 @@ func TestPoolCancel(t *testing.T) { suc := make(chan struct{}, 1) for i := 0; i < 20; i++ { - jobCh <- worker.Job{Data: Job{suc: suc, d: time.Second}} + jobCh <- worker.Job{Data: Job{suc: suc}} } <-suc From fb45ea139d26468ba1f2bc7dbee81f429ea1a88c Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Mon, 9 May 2016 21:29:13 +0200 Subject: [PATCH 2/2] Add barrier --- src/restic/worker/pool_test.go | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/restic/worker/pool_test.go b/src/restic/worker/pool_test.go index 5c7ca91e4..78cda9cd7 100644 --- a/src/restic/worker/pool_test.go +++ b/src/restic/worker/pool_test.go @@ -96,24 +96,30 @@ type Job struct { suc chan struct{} } -func wait(job worker.Job, done <-chan struct{}) (interface{}, error) { - j := job.Data.(Job) - select { - case j.suc <- struct{}{}: - return time.Now(), nil - case <-done: - return nil, errCancelled - } -} - func TestPoolCancel(t *testing.T) { + barrier := make(chan struct{}) + + wait := func(job worker.Job, done <-chan struct{}) (interface{}, error) { + j := job.Data.(Job) + + <-barrier + + select { + case j.suc <- struct{}{}: + return time.Now(), nil + case <-done: + return nil, errCancelled + } + } + jobCh, resCh, p := newBufferedPool(20, concurrency, wait) - suc := make(chan struct{}, 1) + suc := make(chan struct{}) for i := 0; i < 20; i++ { jobCh <- worker.Job{Data: Job{suc: suc}} } + close(barrier) <-suc p.Cancel() p.Wait()