puddle icon indicating copy to clipboard operation
puddle copied to clipboard

Problem with function Close()

Open u-veles-a opened this issue 6 years ago • 1 comments

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()
    }

... }

u-veles-a avatar Oct 30 '19 13:10 u-veles-a

Sorry, I don't understand what you mean. Do you have an example that demonstrates this issue?

jackc avatar Jan 26 '20 01:01 jackc