Skip to content

Commit

Permalink
Increase default timeouts
Browse files Browse the repository at this point in the history
Client timeouts need to be higher than server timeouts,
so that work does not accumulate on the server with retries.

This was not true by default, the gocql default timeout was lower
than the Cassandra default timeout.

Closes #1671
Closes #1701
  • Loading branch information
martin-sucha committed Aug 28, 2023
1 parent 7a686db commit cb906bd
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 7 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
26 changes: 20 additions & 6 deletions cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions conn_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down

0 comments on commit cb906bd

Please sign in to comment.