From dfbb355ab5afe3f1e44eb24d0a247f1ca3ab7241 Mon Sep 17 00:00:00 2001 From: alitto Date: Sat, 6 Jun 2020 20:54:16 -0300 Subject: [PATCH] Fix corner case in rated resizer --- pond_blackbox_test.go | 23 +++++++++++++++++++++++ resizer.go | 2 +- resizer_test.go | 6 ++++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/pond_blackbox_test.go b/pond_blackbox_test.go index f9599bb..c1a7b5a 100644 --- a/pond_blackbox_test.go +++ b/pond_blackbox_test.go @@ -190,6 +190,29 @@ func TestTrySubmit(t *testing.T) { assertEqual(t, int32(1), atomic.LoadInt32(&doneCount)) } +func TestSubmitToIdle(t *testing.T) { + + pool := pond.New(1, 5) + + // Submit a task and wait for it to complete + pool.SubmitAndWait(func() { + time.Sleep(1 * time.Millisecond) + }) + + assertEqual(t, int(1), pool.Running()) + assertEqual(t, int(1), pool.Idle()) + + // Submit another task (this one should go to the idle worker) + pool.SubmitAndWait(func() { + time.Sleep(1 * time.Millisecond) + }) + + pool.StopAndWait() + + assertEqual(t, int(0), pool.Running()) + assertEqual(t, int(0), pool.Idle()) +} + func TestRunning(t *testing.T) { workerCount := 5 diff --git a/resizer.go b/resizer.go index d442fad..4bee95d 100644 --- a/resizer.go +++ b/resizer.go @@ -46,7 +46,7 @@ func RatedResizer(rate int) ResizingStrategy { func (r *ratedResizer) Resize(runningWorkers, minWorkers, maxWorkers int) bool { - if r.rate == 1 { + if r.rate == 1 || runningWorkers == 0 { return true } diff --git a/resizer_test.go b/resizer_test.go index f362468..e2cae60 100644 --- a/resizer_test.go +++ b/resizer_test.go @@ -9,9 +9,11 @@ func TestRatedResizer(t *testing.T) { resizer := RatedResizer(3) assertEqual(t, true, resizer.Resize(0, 0, 10)) - assertEqual(t, false, resizer.Resize(1, 0, 10)) + assertEqual(t, true, resizer.Resize(0, 0, 10)) + assertEqual(t, true, resizer.Resize(1, 0, 10)) assertEqual(t, false, resizer.Resize(2, 0, 10)) - assertEqual(t, true, resizer.Resize(3, 0, 10)) + assertEqual(t, false, resizer.Resize(3, 0, 10)) + assertEqual(t, true, resizer.Resize(4, 0, 10)) } func TestRatedResizerWithRate1(t *testing.T) {