@@ -106,6 +106,28 @@ func (w *wantConn) tryDeliver(cn *Conn, err error) bool {
106
106
return true
107
107
}
108
108
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
+
109
131
type wantConnResult struct {
110
132
cn * Conn
111
133
err error
@@ -363,23 +385,29 @@ func (p *ConnPool) asyncNewConn(ctx context.Context) (*Conn, error) {
363
385
return nil , ctx .Err ()
364
386
}
365
387
366
- dialCtx , cancel := context .WithTimeout (ctx , p .cfg .DialTimeout )
388
+ dialCtx , cancel := context .WithTimeout (context . WithoutCancel ( ctx ) , p .cfg .DialTimeout )
367
389
368
390
w := & wantConn {
369
391
ctx : dialCtx ,
370
392
cancelCtx : cancel ,
371
393
result : make (chan wantConnResult , 1 ),
372
394
}
395
+ var err error
396
+ defer func () {
397
+ if err != nil {
398
+ w .cancel (ctx , p )
399
+ }
400
+ }()
373
401
374
402
go func (w * wantConn ) {
375
403
defer w .cancelCtx ()
376
404
defer func () { <- p .dialsInProgress }() // Release connection creation permission
377
405
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 {
381
409
return
382
- } else if err == nil && ! delivered {
410
+ } else if cnErr == nil && ! delivered {
383
411
p .Put (w .ctx , cn )
384
412
} else { // freeTurn after error
385
413
p .freeTurn ()
@@ -388,9 +416,11 @@ func (p *ConnPool) asyncNewConn(ctx context.Context) (*Conn, error) {
388
416
389
417
select {
390
418
case <- ctx .Done ():
391
- return nil , ctx .Err ()
419
+ err = ctx .Err ()
420
+ return nil , err
392
421
case result := <- w .result :
393
- return result .cn , result .err
422
+ err = result .err
423
+ return result .cn , err
394
424
}
395
425
}
396
426
0 commit comments