Skip to content

Commit 5ca728f

Browse files
committed
fix race in spawnItems
1 parent 09b942e commit 5ca728f

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

internal/pool/pool.go

+13-6
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,19 @@ func (p *Pool[PT, T]) spawnItems(ctx context.Context) {
229229
return
230230
case <-p.itemTokens:
231231
// got token, must create item
232+
createLoop:
232233
for {
233-
p.wg.Add(1)
234-
err := p.trySpawn(ctx)
235-
if err == nil {
236-
break
234+
select {
235+
case <-ctx.Done():
236+
return
237+
case <-p.done:
238+
return
239+
default:
240+
p.wg.Add(1)
241+
err := p.trySpawn(ctx)
242+
if err == nil {
243+
break createLoop
244+
}
237245
}
238246
// spawn was unsuccessful, need to try again.
239247
// token must always result in new item and not be lost.
@@ -251,7 +259,7 @@ func (p *Pool[PT, T]) trySpawn(ctx context.Context) error {
251259
// item was created successfully, put it in queue
252260
select {
253261
case <-ctx.Done():
254-
return ctx.Err()
262+
return nil
255263
case <-p.done:
256264
return nil
257265
case p.queue <- item:
@@ -381,7 +389,6 @@ func (p *Pool[PT, T]) getItem(ctx context.Context) (_ PT, finalErr error) {
381389
_ = p.closeItem(ctx, item) // clean up dead item
382390
}
383391
p.itemTokens <- struct{}{} // signal spawn goroutine to create a new item
384-
385392
// and try again
386393
}
387394
}

0 commit comments

Comments
 (0)