@@ -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+
109131type 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