in dax/internal/client/cluster.go [296:347]
func (cc *ClusterDaxClient) retry(ctx context.Context, op string, action func(client DaxAPI, o RequestOptions) error, opt RequestOptions) (err error) {
defer func() {
if daxErr, ok := err.(daxError); ok {
err = convertDaxError(daxErr)
}
}()
ctx = cc.newContext(ctx, opt)
attempts := opt.RetryMaxAttempts
opt.RetryMaxAttempts = 0 // disable retries on single node client
var client DaxAPI
// Start from 0 to accomodate for the initial request
for i := 0; i <= attempts; i++ {
if i > 0 && opt.Logger != nil && opt.LogLevel.Matches(utils.LogDebugWithRequestRetries) {
opt.Logger.Logf(logging.Debug, "Retrying Request %s/%s, attempt %d", service, op, i)
}
client, err = cc.cluster.client(client, op)
if err == nil {
err = action(client, opt)
}
if err == nil {
// success
return nil
}
if !isRetryable(opt, err) {
return err
}
if i != attempts {
if opt.Logger != nil && opt.LogLevel.Matches(utils.LogDebugWithRequestRetries) {
opt.Logger.Logf(logging.Debug, "Error in executing request %s/%s. : %s", service, op, err)
}
var delay time.Duration
delay = opt.Retryer.RetryDelay(i+1, err)
if delay == 0 {
delay = opt.RetryDelay
}
if delay > 0 {
if err = SleepWithContext(ctx, op, delay); err != nil {
return err
}
}
}
}
return err
}