Skip to content

Commit

Permalink
Merge pull request etcd-io#7420 from heyitsanthony/dial-timeout-report
Browse files Browse the repository at this point in the history
clientv3: pass back dial error on dial timeout
  • Loading branch information
Anthony Romano authored Mar 6, 2017
2 parents 4e2fe05 + 270dc94 commit 317f357
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 10 deletions.
31 changes: 23 additions & 8 deletions clientv3/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,9 @@ type Client struct {
Auth
Maintenance

conn *grpc.ClientConn
conn *grpc.ClientConn
dialerrc chan error

cfg Config
creds *credentials.TransportCredentials
balancer *simpleBalancer
Expand Down Expand Up @@ -214,7 +216,14 @@ func (c *Client) dialSetupOpts(endpoint string, dopts ...grpc.DialOption) (opts
default:
}
dialer := &net.Dialer{Timeout: t}
return dialer.DialContext(c.ctx, proto, host)
conn, err := dialer.DialContext(c.ctx, proto, host)
if err != nil {
select {
case c.dialerrc <- err:
default:
}
}
return conn, err
}
opts = append(opts, grpc.WithDialer(f))

Expand Down Expand Up @@ -316,11 +325,12 @@ func newClient(cfg *Config) (*Client, error) {

ctx, cancel := context.WithCancel(baseCtx)
client := &Client{
conn: nil,
cfg: *cfg,
creds: creds,
ctx: ctx,
cancel: cancel,
conn: nil,
dialerrc: make(chan error, 1),
cfg: *cfg,
creds: creds,
ctx: ctx,
cancel: cancel,
}
if cfg.Username != "" && cfg.Password != "" {
client.Username = cfg.Username
Expand All @@ -347,9 +357,14 @@ func newClient(cfg *Config) (*Client, error) {
case <-waitc:
}
if !hasConn {
err := grpc.ErrClientConnTimeout
select {
case err = <-client.dialerrc:
default:
}
client.cancel()
conn.Close()
return nil, grpc.ErrClientConnTimeout
return nil, err
}
}

Expand Down
4 changes: 2 additions & 2 deletions clientv3/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@ func TestDialTimeout(t *testing.T) {

donec := make(chan error)
go func() {
// without timeout, grpc keeps redialing if connection refused
// without timeout, dial continues forever on ipv4 blackhole
cfg := Config{
Endpoints: []string{"localhost:12345"},
Endpoints: []string{"http://254.0.0.1:12345"},
DialTimeout: 2 * time.Second}
c, err := New(cfg)
if c != nil || err == nil {
Expand Down

0 comments on commit 317f357

Please sign in to comment.