diff --git a/CHANGELOG.md b/CHANGELOG.md index 685f9931f..b704ae9b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 information about that every time this information is received. (#1714) ### Changed - Tracer created with NewTraceWriter now includes the thread information from trace events in the output. (#1716) +- Increased default timeouts so that they are higher than Cassandra default timeouts. + This should help prevent issues where a default configuration overloads a server using default timeouts + during retries. (#1701) ### Fixed diff --git a/cluster.go b/cluster.go index cf403dd6c..d760b3abc 100644 --- a/cluster.go +++ b/cluster.go @@ -51,14 +51,28 @@ type ClusterConfig struct { // versions the protocol selected is not defined (ie, it can be any of the supported in the cluster) ProtoVersion int - // Connection timeout (default: 600ms) - // ConnectTimeout is used to set up the default dialer and is ignored if Dialer or HostDialer is provided. + // Timeout limits the time spent on the client side while executing a query. + // Specifically, query or batch execution will return an error if the client does not receive a response + // from the server within the Timeout period. + // Timeout is also used to configure the read timeout on the underlying network connection. + // Client Timeout should always be higher than the request timeouts configured on the server, + // so that retries don't overload the server. + // Timeout has a default value of 11 seconds, which is higher than default server timeout for most query types. + // Timeout is not applied to requests during initial connection setup, see ConnectTimeout. Timeout time.Duration - // Initial connection timeout, used during initial dial to server (default: 600ms) + // ConnectTimeout limits the time spent during connection setup. + // During initial connection setup, internal queries, AUTH requests will return an error if the client + // does not receive a response within the Timeout period. + // ConnectTimeout is applied to the connection setup queries independently. + // ConnectTimeout also limits the duration of dialing a new TCP connection + // in case there is no Dialer nor HostDialer configured. + // ConnectTimeout has a default value of 11 seconds. ConnectTimeout time.Duration - // Timeout for writing a query. Defaults to Timeout if not specified. + // WriteTimeout limits the time the driver waits to write a request to a network connection. + // WriteTimeout should be lower than or equal to Timeout. + // WriteTimeout defaults to the value of Timeout. WriteTimeout time.Duration // Port used when dialing. @@ -244,8 +258,8 @@ func NewCluster(hosts ...string) *ClusterConfig { cfg := &ClusterConfig{ Hosts: hosts, CQLVersion: "3.0.0", - Timeout: 600 * time.Millisecond, - ConnectTimeout: 600 * time.Millisecond, + Timeout: 11 * time.Second, + ConnectTimeout: 11 * time.Second, Port: 9042, NumConns: 2, Consistency: Quorum, diff --git a/cluster_test.go b/cluster_test.go index f7fe5acbf..0d580dbd4 100644 --- a/cluster_test.go +++ b/cluster_test.go @@ -10,7 +10,7 @@ import ( func TestNewCluster_Defaults(t *testing.T) { cfg := NewCluster() assertEqual(t, "cluster config cql version", "3.0.0", cfg.CQLVersion) - assertEqual(t, "cluster config timeout", 600*time.Millisecond, cfg.Timeout) + assertEqual(t, "cluster config timeout", 11*time.Second, cfg.Timeout) assertEqual(t, "cluster config port", 9042, cfg.Port) assertEqual(t, "cluster config num-conns", 2, cfg.NumConns) assertEqual(t, "cluster config consistency", Quorum, cfg.Consistency) diff --git a/conn_test.go b/conn_test.go index 42bdbb637..2e4c0ebb2 100644 --- a/conn_test.go +++ b/conn_test.go @@ -229,6 +229,7 @@ func TestStartupTimeout(t *testing.T) { // Set very long query connection timeout // so we know CreateSession() is using the ConnectTimeout cluster.Timeout = time.Second * 5 + cluster.ConnectTimeout = 600 * time.Millisecond // Create session should timeout during connect attempt _, err := cluster.CreateSession()