diff --git a/fbxpool/pool.go b/fbxpool/pool.go index 1ce52f3..732c8e1 100644 --- a/fbxpool/pool.go +++ b/fbxpool/pool.go @@ -22,6 +22,7 @@ var defaultMinIdleConns = int32(0) var defaultMaxConnLifetime = time.Hour var defaultMaxConnIdleTime = time.Minute * 30 var defaultHealthCheckPeriod = time.Minute +var defaultPingTimeout = time.Duration(0) type connResource struct { conn *fbx.Conn @@ -353,6 +354,7 @@ func NewWithConfig(ctx context.Context, config *Config) (*Pool, error) { // - pool_max_conn_idle_time: duration string (default 30 minutes) // - pool_health_check_period: duration string (default 1 minute) // - pool_max_conn_lifetime_jitter: duration string (default 0) +// - pool_ping_timeout: duration string (default 0, meaning no timeout) // // See Config for definitions of these arguments. // @@ -453,6 +455,17 @@ func ParseConfig(connString string) (*Config, error) { config.MaxConnLifetimeJitter = d } + if s, ok := config.ConnConfig.RuntimeParams["pool_ping_timeout"]; ok { + delete(connConfig.RuntimeParams, "pool_ping_timeout") + d, err := time.ParseDuration(s) + if err != nil { + return nil, fbconn.NewParseConfigError(connString, "cannot parse pool_ping_timeout", err) + } + config.PingTimeout = d + } else { + config.PingTimeout = defaultPingTimeout + } + return config, nil } diff --git a/fbxpool/pool_test.go b/fbxpool/pool_test.go index 0152c45..22258ec 100644 --- a/fbxpool/pool_test.go +++ b/fbxpool/pool_test.go @@ -44,13 +44,27 @@ func TestConnectConfig(t *testing.T) { func TestParseConfigExtractsPoolArguments(t *testing.T) { t.Parallel() - config, err := fbxpool.ParseConfig("pool_max_conns=42 pool_min_conns=1 pool_min_idle_conns=2") + config, err := fbxpool.ParseConfig("pool_max_conns=42 pool_min_conns=1 pool_min_idle_conns=2 pool_ping_timeout=250ms") assert.NoError(t, err) assert.EqualValues(t, 42, config.MaxConns) assert.EqualValues(t, 1, config.MinConns) assert.EqualValues(t, 2, config.MinIdleConns) + assert.Equal(t, 250*time.Millisecond, config.PingTimeout) + + // Pool parameters must be removed from the connection's RuntimeParams. assert.NotContains(t, config.ConnConfig.RuntimeParams, "pool_max_conns") assert.NotContains(t, config.ConnConfig.RuntimeParams, "pool_min_conns") + assert.NotContains(t, config.ConnConfig.RuntimeParams, "pool_min_idle_conns") + assert.NotContains(t, config.ConnConfig.RuntimeParams, "pool_ping_timeout") + + config, err = fbxpool.ParseConfig("") + assert.NoError(t, err) + assert.Zero(t, config.PingTimeout) + + for _, v := range []string{"abc", "250"} { + _, err := fbxpool.ParseConfig("pool_ping_timeout=" + v) + assert.Errorf(t, err, "pool_ping_timeout=%s should be rejected", v) + } } func TestConstructorIgnoresContext(t *testing.T) {