func()

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
}