diff --git a/clientv3/client.go b/clientv3/client.go index a0e059d5e35..9dbc34b1eba 100644 --- a/clientv3/client.go +++ b/clientv3/client.go @@ -31,6 +31,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" ) @@ -215,6 +216,16 @@ func (c *Client) dialSetupOpts(endpoint string, dopts ...grpc.DialOption) (opts if c.cfg.DialTimeout > 0 { opts = []grpc.DialOption{grpc.WithTimeout(c.cfg.DialTimeout)} } + if c.cfg.DialKeepAliveTime > 0 { + params := keepalive.ClientParameters{ + Time: c.cfg.DialKeepAliveTime, + } + // Only relevant when KeepAliveTime is non-zero + if c.cfg.DialKeepAliveTimeout > 0 { + params.Timeout = c.cfg.DialKeepAliveTimeout + } + opts = append(opts, grpc.WithKeepaliveParams(params)) + } opts = append(opts, dopts...) f := func(host string, t time.Duration) (net.Conn, error) { diff --git a/clientv3/config.go b/clientv3/config.go index dda72a748e6..d9545e430c1 100644 --- a/clientv3/config.go +++ b/clientv3/config.go @@ -33,6 +33,14 @@ type Config struct { // DialTimeout is the timeout for failing to establish a connection. DialTimeout time.Duration `json:"dial-timeout"` + // DialKeepAliveTime is the time in seconds after which client pings the server to see if + // transport is alive. + DialKeepAliveTime time.Duration `json:"dial-keep-alive-time"` + + // DialKeepAliveTimeout is the time in seconds that the client waits for a response for the + // keep-alive probe. If the response is not received in this time, the connection is closed. + DialKeepAliveTimeout time.Duration `json:"dial-keep-alive-timeout"` + // TLS holds the client secure credentials, if any. TLS *tls.Config