@@ -1205,7 +1205,6 @@ func (t *Transport) dial(ctx context.Context, network, addr string) (net.Conn, e
1205
1205
type wantConn struct {
1206
1206
cm connectMethod
1207
1207
key connectMethodKey // cm.key()
1208
- ctx context.Context // context for dial
1209
1208
ready chan struct {} // closed when pc, err pair is delivered
1210
1209
1211
1210
// hooks for testing to know when dials are done
@@ -1214,7 +1213,8 @@ type wantConn struct {
1214
1213
beforeDial func ()
1215
1214
afterDial func ()
1216
1215
1217
- mu sync.Mutex // protects pc, err, close(ready)
1216
+ mu sync.Mutex // protects ctx, pc, err, close(ready)
1217
+ ctx context.Context // context for dial, cleared after delivered or canceled
1218
1218
pc * persistConn
1219
1219
err error
1220
1220
}
@@ -1229,6 +1229,13 @@ func (w *wantConn) waiting() bool {
1229
1229
}
1230
1230
}
1231
1231
1232
+ // getCtxForDial returns context for dial or nil if connection was delivered or canceled.
1233
+ func (w * wantConn ) getCtxForDial () context.Context {
1234
+ w .mu .Lock ()
1235
+ defer w .mu .Unlock ()
1236
+ return w .ctx
1237
+ }
1238
+
1232
1239
// tryDeliver attempts to deliver pc, err to w and reports whether it succeeded.
1233
1240
func (w * wantConn ) tryDeliver (pc * persistConn , err error ) bool {
1234
1241
w .mu .Lock ()
@@ -1238,6 +1245,7 @@ func (w *wantConn) tryDeliver(pc *persistConn, err error) bool {
1238
1245
return false
1239
1246
}
1240
1247
1248
+ w .ctx = nil
1241
1249
w .pc = pc
1242
1250
w .err = err
1243
1251
if w .pc == nil && w .err == nil {
@@ -1255,6 +1263,7 @@ func (w *wantConn) cancel(t *Transport, err error) {
1255
1263
close (w .ready ) // catch misbehavior in future delivery
1256
1264
}
1257
1265
pc := w .pc
1266
+ w .ctx = nil
1258
1267
w .pc = nil
1259
1268
w .err = err
1260
1269
w .mu .Unlock ()
@@ -1463,8 +1472,12 @@ func (t *Transport) queueForDial(w *wantConn) {
1463
1472
// If the dial is canceled or unsuccessful, dialConnFor decrements t.connCount[w.cm.key()].
1464
1473
func (t * Transport ) dialConnFor (w * wantConn ) {
1465
1474
defer w .afterDial ()
1475
+ ctx := w .getCtxForDial ()
1476
+ if ctx == nil {
1477
+ return
1478
+ }
1466
1479
1467
- pc , err := t .dialConn (w . ctx , w .cm )
1480
+ pc , err := t .dialConn (ctx , w .cm )
1468
1481
delivered := w .tryDeliver (pc , err )
1469
1482
if err == nil && (! delivered || pc .alt != nil ) {
1470
1483
// pconn was not passed to w,
0 commit comments