func()

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
}