From 62d7bae496c22b7e75bbb2f7321dc8586b74e8c5 Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Fri, 31 Mar 2017 14:24:43 -0700 Subject: [PATCH] clientv3: respect dial timeout when authenticating Fixes #7627 --- clientv3/client.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/clientv3/client.go b/clientv3/client.go index 160499fdd..d4a7d3410 100644 --- a/clientv3/client.go +++ b/clientv3/client.go @@ -294,8 +294,16 @@ func (c *Client) dial(endpoint string, dopts ...grpc.DialOption) (*grpc.ClientCo tokenMu: &sync.RWMutex{}, } - err := c.getToken(c.ctx) - if err != nil { + ctx := c.ctx + if c.cfg.DialTimeout > 0 { + cctx, cancel := context.WithTimeout(ctx, c.cfg.DialTimeout) + defer cancel() + ctx = cctx + } + if err := c.getToken(ctx); err != nil { + if err == ctx.Err() && ctx.Err() != c.ctx.Err() { + err = grpc.ErrClientConnTimeout + } return nil, err } @@ -351,6 +359,8 @@ func newClient(cfg *Config) (*Client, error) { client.balancer = newSimpleBalancer(cfg.Endpoints) conn, err := client.dial(cfg.Endpoints[0], grpc.WithBalancer(client.balancer)) if err != nil { + client.cancel() + client.balancer.Close() return nil, err } client.conn = conn @@ -374,6 +384,7 @@ func newClient(cfg *Config) (*Client, error) { default: } client.cancel() + client.balancer.Close() conn.Close() return nil, err }