diff --git a/go/pools/refresh_pool.go b/go/pools/refresh_pool.go index e7ee50d803b..56d077e21a3 100644 --- a/go/pools/refresh_pool.go +++ b/go/pools/refresh_pool.go @@ -36,6 +36,7 @@ type ( refreshTicker *time.Ticker refreshStop chan struct{} refreshWg sync.WaitGroup + mu sync.Mutex pool refreshPool } @@ -64,6 +65,9 @@ func (pr *poolRefresh) startRefreshTicker() { if pr == nil { return } + pr.mu.Lock() + defer pr.mu.Unlock() + pr.refreshTicker = time.NewTicker(pr.refreshInterval) pr.refreshStop = make(chan struct{}) pr.refreshWg.Add(1) @@ -88,10 +92,16 @@ func (pr *poolRefresh) startRefreshTicker() { } func (pr *poolRefresh) stop() { - if pr == nil || pr.refreshTicker == nil { + if pr == nil { + return + } + pr.mu.Lock() + if pr.refreshTicker == nil { + pr.mu.Unlock() return } pr.refreshTicker.Stop() close(pr.refreshStop) + pr.mu.Unlock() pr.refreshWg.Wait() } diff --git a/go/pools/resource_pool_test.go b/go/pools/resource_pool_test.go index fe5486373c3..82281cd6eb5 100644 --- a/go/pools/resource_pool_test.go +++ b/go/pools/resource_pool_test.go @@ -28,8 +28,8 @@ import ( ) var ( - lastID, count, closeCount, resetCount atomic.Int64 - waitStarts []time.Time + lastID, count, closeCount atomic.Int64 + waitStarts []time.Time ) type TestResource struct { @@ -178,6 +178,7 @@ func TestShrinking(t *testing.T) { waitStarts = waitStarts[:0] p := NewResourcePool(PoolFactory, 5, 5, time.Second, 0, logWait, nil, 0) + defer p.Close() var resources [10]Resource // Leave one empty slot in the pool for i := 0; i < 4; i++ { @@ -365,6 +366,7 @@ func TestReopen(t *testing.T) { assert.Equal(t, expected, stats) assert.EqualValues(t, 5, lastID.Load()) assert.EqualValues(t, 0, count.Load()) + p.Close() } func TestIdleTimeout(t *testing.T) {