agent/utils/retry/retry.go
func RetryWithBackoffCtx(ctx context.Context, backoff Backoff, fn func() error) error {
	var err error
	for {
		select {
		case <-ctx.Done():
			return nil
		default:
		}

		err = fn()

		retriableErr, isRetriableErr := err.(apierrors.Retriable)

		if err == nil || (isRetriableErr && !retriableErr.Retry()) {
			return err
		}

		_time.Sleep(backoff.Duration())
	}
}
func RetryWithBackoffCtx(ctx context.Context, backoff Backoff, fn func() error) error {
	var err error
	for {
		select {
		case <-ctx.Done():
			return nil
		default:
		}

		err = fn()

		retriableErr, isRetriableErr := err.(apierrors.Retriable)

		if err == nil || (isRetriableErr && !retriableErr.Retry()) {
			return err
		}

		_time.Sleep(backoff.Duration())
	}
}
func RetryWithBackoffCtx ( ctx context . Context , backoff Backoff , fn func ( ) error ) error { var err error for { select { case <- ctx . Done ( ) : return nil default : } err = fn ( ) retriableErr , isRetriableErr := err . ( apierrors . Retriable ) if err == nil || ( isRetriableErr && ! retriableErr . Retry ( ) ) { return err } _time . Sleep ( backoff . Duration ( ) ) } }
// RetryWithBackoffCtx takes a context, a Backoff, and a function to call that returns an error
// If the context is done, nil will be returned
// If the error is nil then the function will no longer be called
// If the error is Retriable then that will be used to determine if it should be
// retried
RetryWithBackoffCtx takes a context a Backoff and a function to call that returns an error If the context is done nil will be returned If the error is nil then the function will no longer be called If the error is Retriable then that will be used to determine if it should be retried