Avoid goroutine leak in clientconn

Prior to this change, it was possible for `DialContext` to return
`(nil, err)` without properly closing the `ClientConn`, resulting in an
unavoidable leak of the `resetAddrConn` goroutine.
This commit is contained in:
Tamir Duberstein 2016-08-25 15:18:19 -04:00
parent d8f4ebe77f
commit dd5645bebf
No known key found for this signature in database
GPG Key ID: 1C1E98CC8E17BB89
1 changed files with 5 additions and 7 deletions

View File

@ -234,13 +234,13 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
defer func() {
select {
case <-ctx.Done():
if conn != nil {
conn.Close()
}
conn = nil
err = ctx.Err()
conn, err = nil, ctx.Err()
default:
}
if err != nil {
cc.Close()
}
}()
for _, opt := range opts {
@ -296,11 +296,9 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
return nil, ctx.Err()
case err := <-waitC:
if err != nil {
cc.Close()
return nil, err
}
case <-timeoutCh:
cc.Close()
return nil, ErrClientConnTimeout
}
// If balancer is nil or balancer.Notify() is nil, ok will be false here.