api/client: allow configurable values for RetryWaitMin and RetryWaitMax (#11773)
This commit is contained in:
parent
c9c72d079b
commit
5870c3daa5
|
@ -79,6 +79,14 @@ type Config struct {
|
|||
// (or http.DefaultClient).
|
||||
HttpClient *http.Client
|
||||
|
||||
// MinRetryWait controls the minimum time to wait before retrying when a 5xx
|
||||
// error occurs. Defaults to 1000 milliseconds.
|
||||
MinRetryWait time.Duration
|
||||
|
||||
// MaxRetryWait controls the maximum time to wait before retrying when a 5xx
|
||||
// error occurs. Defaults to 1500 milliseconds.
|
||||
MaxRetryWait time.Duration
|
||||
|
||||
// MaxRetries controls the maximum number of times to retry when a 5xx
|
||||
// error occurs. Set to 0 to disable retrying. Defaults to 2 (for a total
|
||||
// of three tries).
|
||||
|
@ -153,11 +161,13 @@ type TLSConfig struct {
|
|||
// If an error is encountered, this will return nil.
|
||||
func DefaultConfig() *Config {
|
||||
config := &Config{
|
||||
Address: "https://127.0.0.1:8200",
|
||||
HttpClient: cleanhttp.DefaultPooledClient(),
|
||||
Timeout: time.Second * 60,
|
||||
MaxRetries: 2,
|
||||
Backoff: retryablehttp.LinearJitterBackoff,
|
||||
Address: "https://127.0.0.1:8200",
|
||||
HttpClient: cleanhttp.DefaultPooledClient(),
|
||||
Timeout: time.Second * 60,
|
||||
MinRetryWait: time.Millisecond * 1000,
|
||||
MaxRetryWait: time.Millisecond * 1500,
|
||||
MaxRetries: 2,
|
||||
Backoff: retryablehttp.LinearJitterBackoff,
|
||||
}
|
||||
|
||||
transport := config.HttpClient.Transport.(*http.Transport)
|
||||
|
@ -416,6 +426,14 @@ func NewClient(c *Config) (*Client, error) {
|
|||
c.modifyLock.Lock()
|
||||
defer c.modifyLock.Unlock()
|
||||
|
||||
if c.MinRetryWait == 0 {
|
||||
c.MinRetryWait = def.MinRetryWait
|
||||
}
|
||||
|
||||
if c.MaxRetryWait == 0 {
|
||||
c.MaxRetryWait = def.MaxRetryWait
|
||||
}
|
||||
|
||||
if c.HttpClient == nil {
|
||||
c.HttpClient = def.HttpClient
|
||||
}
|
||||
|
@ -476,6 +494,8 @@ func (c *Client) CloneConfig() *Config {
|
|||
newConfig := DefaultConfig()
|
||||
newConfig.Address = c.config.Address
|
||||
newConfig.AgentAddress = c.config.AgentAddress
|
||||
newConfig.MinRetryWait = c.config.MinRetryWait
|
||||
newConfig.MaxRetryWait = c.config.MaxRetryWait
|
||||
newConfig.MaxRetries = c.config.MaxRetries
|
||||
newConfig.Timeout = c.config.Timeout
|
||||
newConfig.Backoff = c.config.Backoff
|
||||
|
@ -540,6 +560,44 @@ func (c *Client) Limiter() *rate.Limiter {
|
|||
return c.config.Limiter
|
||||
}
|
||||
|
||||
// SetMinRetryWait sets the minimum time to wait before retrying in the case of certain errors.
|
||||
func (c *Client) SetMinRetryWait(retryWait time.Duration) {
|
||||
c.modifyLock.RLock()
|
||||
defer c.modifyLock.RUnlock()
|
||||
c.config.modifyLock.Lock()
|
||||
defer c.config.modifyLock.Unlock()
|
||||
|
||||
c.config.MinRetryWait = retryWait
|
||||
}
|
||||
|
||||
func (c *Client) MinRetryWait() time.Duration {
|
||||
c.modifyLock.RLock()
|
||||
defer c.modifyLock.RUnlock()
|
||||
c.config.modifyLock.RLock()
|
||||
defer c.config.modifyLock.RUnlock()
|
||||
|
||||
return c.config.MinRetryWait
|
||||
}
|
||||
|
||||
// SetMaxRetryWait sets the maximum time to wait before retrying in the case of certain errors.
|
||||
func (c *Client) SetMaxRetryWait(retryWait time.Duration) {
|
||||
c.modifyLock.RLock()
|
||||
defer c.modifyLock.RUnlock()
|
||||
c.config.modifyLock.Lock()
|
||||
defer c.config.modifyLock.Unlock()
|
||||
|
||||
c.config.MaxRetryWait = retryWait
|
||||
}
|
||||
|
||||
func (c *Client) MaxRetryWait() time.Duration {
|
||||
c.modifyLock.RLock()
|
||||
defer c.modifyLock.RUnlock()
|
||||
c.config.modifyLock.RLock()
|
||||
defer c.config.modifyLock.RUnlock()
|
||||
|
||||
return c.config.MaxRetryWait
|
||||
}
|
||||
|
||||
// SetMaxRetries sets the number of retries that will be used in the case of certain errors
|
||||
func (c *Client) SetMaxRetries(retries int) {
|
||||
c.modifyLock.RLock()
|
||||
|
@ -770,6 +828,8 @@ func (c *Client) Clone() (*Client, error) {
|
|||
newConfig := &Config{
|
||||
Address: config.Address,
|
||||
HttpClient: config.HttpClient,
|
||||
MinRetryWait: config.MinRetryWait,
|
||||
MaxRetryWait: config.MaxRetryWait,
|
||||
MaxRetries: config.MaxRetries,
|
||||
Timeout: config.Timeout,
|
||||
Backoff: config.Backoff,
|
||||
|
@ -873,6 +933,8 @@ func (c *Client) RawRequestWithContext(ctx context.Context, r *Request) (*Respon
|
|||
|
||||
c.config.modifyLock.RLock()
|
||||
limiter := c.config.Limiter
|
||||
minRetryWait := c.config.MinRetryWait
|
||||
maxRetryWait := c.config.MaxRetryWait
|
||||
maxRetries := c.config.MaxRetries
|
||||
checkRetry := c.config.CheckRetry
|
||||
backoff := c.config.Backoff
|
||||
|
@ -934,8 +996,8 @@ START:
|
|||
|
||||
client := &retryablehttp.Client{
|
||||
HTTPClient: httpClient,
|
||||
RetryWaitMin: 1000 * time.Millisecond,
|
||||
RetryWaitMax: 1500 * time.Millisecond,
|
||||
RetryWaitMin: minRetryWait,
|
||||
RetryWaitMax: maxRetryWait,
|
||||
RetryMax: maxRetries,
|
||||
Backoff: backoff,
|
||||
CheckRetry: checkRetry,
|
||||
|
|
Loading…
Reference in a new issue