diff --git a/clientv3/client.go b/clientv3/client.go index 66d5a3c0f964..dd8725188da2 100644 --- a/clientv3/client.go +++ b/clientv3/client.go @@ -138,11 +138,13 @@ func (c *Client) dialTarget(endpoint string) (proto string, host string, creds * return } -// dialSetupOpts gives the dial opts prioer to any authentication -func (c *Client) dialSetupOpts(endpoint string, dopts ...grpc.DialOption) []grpc.DialOption { - opts := []grpc.DialOption{ - grpc.WithBlock(), - grpc.WithTimeout(c.cfg.DialTimeout), +// dialSetupOpts gives the dial opts prior to any authentication +func (c *Client) dialSetupOpts(endpoint string, dopts ...grpc.DialOption) (opts []grpc.DialOption) { + if c.cfg.DialTimeout > 0 { + opts = append(opts, grpc.WithTimeout(c.cfg.DialTimeout)) + } + if !c.cfg.DialNoWait { + opts = append(opts, grpc.WithBlock()) } opts = append(opts, dopts...) diff --git a/clientv3/client_test.go b/clientv3/client_test.go index 63ff8146e18b..5d3c6d25a0b6 100644 --- a/clientv3/client_test.go +++ b/clientv3/client_test.go @@ -56,6 +56,15 @@ func TestDialTimeout(t *testing.T) { } } +func TestDialNoWait(t *testing.T) { + cfg := Config{Endpoints: []string{"foo:12345"}, DialNoWait: true} + c, err := New(cfg) + if c == nil || err != nil { + t.Fatalf("new client with DialNoWait should succeed, got %v", err) + } + c.Close() +} + func TestIsHaltErr(t *testing.T) { if !isHaltErr(nil, fmt.Errorf("etcdserver: some etcdserver error")) { t.Errorf(`error prefixed with "etcdserver: " should be Halted by default`) diff --git a/clientv3/config.go b/clientv3/config.go index 066b41ecef99..2e9745a90346 100644 --- a/clientv3/config.go +++ b/clientv3/config.go @@ -31,6 +31,9 @@ type Config struct { // DialTimeout is the timeout for failing to establish a connection. DialTimeout time.Duration + // DialNoWait, when true, returns a Client before establishing a connection. + DialNoWait bool + // TLS holds the client secure credentials, if any. TLS *tls.Config