in dax/internal/client/cluster.go [322:389]
func (cc *ClusterDaxClient) retry(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(opt)
var sleepFun func() error
if opt.RetryDelay > 0 {
retryDelay := opt.RetryDelay
if opt.SleepDelayFn == nil {
sleepFun = func() error {
return aws.SleepWithContext(ctx, retryDelay)
}
} else {
sleepFun = func() error {
opt.SleepDelayFn(retryDelay)
return nil
}
}
}
attempts := opt.MaxRetries
opt.MaxRetries = 0 // disable retries on single node client
var req request.Request
var ok bool
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(aws.LogDebugWithRequestRetries) {
opt.Logger.Log(fmt.Sprintf("DEBUG: Retrying Request %s/%s, attempt %d", service, op, i))
}
client, err = cc.cluster.client(client)
if err != nil {
if req, ok = cc.shouldRetry(opt, err); !ok {
return err
}
}
if err == nil {
if err = action(client, opt); err == nil {
return nil
} else if req, ok = cc.shouldRetry(opt, err); !ok {
return err
}
}
if i != attempts {
req.RetryCount = i + 1
delay := opt.Retryer.RetryRules(&req)
if delay != 0 {
if opt.SleepDelayFn == nil {
aws.SleepWithContext(ctx, delay)
} else {
opt.SleepDelayFn(delay)
}
} else if sleepFun != nil {
if err := sleepFun(); err != nil {
return awserr.New(request.CanceledErrorCode, "request context canceled", err)
}
}
}
}
return err
}