Skip to content

Commit d07d3bc

Browse files
committed
fix connection leaks
1 parent 457fd2c commit d07d3bc

File tree

1 file changed

+37
-7
lines changed

1 file changed

+37
-7
lines changed

internal/pool/pool.go

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,28 @@ func (w *wantConn) tryDeliver(cn *Conn, err error) bool {
106106
return true
107107
}
108108

109+
func (w *wantConn) cancel(ctx context.Context, p *ConnPool) {
110+
w.mu.Lock()
111+
var cn *Conn
112+
if w.done {
113+
select {
114+
case result := <-w.result:
115+
cn = result.cn
116+
default:
117+
}
118+
} else {
119+
close(w.result)
120+
}
121+
122+
w.done = true
123+
w.ctx = nil
124+
w.mu.Unlock()
125+
126+
if cn != nil {
127+
p.Put(ctx, cn)
128+
}
129+
}
130+
109131
type wantConnResult struct {
110132
cn *Conn
111133
err error
@@ -363,23 +385,29 @@ func (p *ConnPool) asyncNewConn(ctx context.Context) (*Conn, error) {
363385
return nil, ctx.Err()
364386
}
365387

366-
dialCtx, cancel := context.WithTimeout(ctx, p.cfg.DialTimeout)
388+
dialCtx, cancel := context.WithTimeout(context.WithoutCancel(ctx), p.cfg.DialTimeout)
367389

368390
w := &wantConn{
369391
ctx: dialCtx,
370392
cancelCtx: cancel,
371393
result: make(chan wantConnResult, 1),
372394
}
395+
var err error
396+
defer func() {
397+
if err != nil {
398+
w.cancel(ctx, p)
399+
}
400+
}()
373401

374402
go func(w *wantConn) {
375403
defer w.cancelCtx()
376404
defer func() { <-p.dialsInProgress }() // Release connection creation permission
377405

378-
cn, err := p.newConn(w.ctx, true)
379-
delivered := w.tryDeliver(cn, err)
380-
if err == nil && delivered {
406+
cn, cnErr := p.newConn(w.ctx, true)
407+
delivered := w.tryDeliver(cn, cnErr)
408+
if cnErr == nil && delivered {
381409
return
382-
} else if err == nil && !delivered {
410+
} else if cnErr == nil && !delivered {
383411
p.Put(w.ctx, cn)
384412
} else { // freeTurn after error
385413
p.freeTurn()
@@ -388,9 +416,11 @@ func (p *ConnPool) asyncNewConn(ctx context.Context) (*Conn, error) {
388416

389417
select {
390418
case <-ctx.Done():
391-
return nil, ctx.Err()
419+
err = ctx.Err()
420+
return nil, err
392421
case result := <-w.result:
393-
return result.cn, result.err
422+
err = result.err
423+
return result.cn, err
394424
}
395425
}
396426

0 commit comments

Comments
 (0)