puddle
puddle copied to clipboard
Problem with function Close()
Hi. pool.go
func (p *Pool) Acquire(ctx context.Context) (*Resource, error) {
...
**p.allResources** = append(p.allResources, res)
**p.destructWG.Add(1)**
p.cond.L.Unlock()
value, err := p.constructResourceValue(ctx)
p.cond.L.Lock()
if err != nil {
p.allResources = removeResource(p.allResources, res)
**p.destructWG.Done()**
...
}
func (p *Pool) Close() {
...
for _, res := range **p.idleResources** {
p.allResources = removeResource(p.allResources, res)
go p.destructResourceValue(res.value)
}
// Different WaitGroup counter
...
**p.destructWG.Wait()**
// process freezes because
// len(p.idleResources) != len(p.allResources)
}
The easiest way to solve:
func (p *Pool) Close() {
for _, res := range **p.idleResources** {
p.allResources = removeResource(p.allResources, res)
go p.destructResourceValue(res.value)
}
for _, res := range p.allResources {
p.allResources = removeResource(p.allResources, res)
p.destructWG.Done()
}
... }
Sorry, I don't understand what you mean. Do you have an example that demonstrates this issue?