Struct mz_ore::retry::Retry

source ·
pub struct Retry {
    initial_backoff: Duration,
    factor: f64,
    clamp_backoff: Duration,
    max_duration: Duration,
    max_tries: usize,
}
Available on crate feature async only.
Expand description

Configures a retry operation.

See the module documentation for usage examples.

Fields§

§initial_backoff: Duration§factor: f64§clamp_backoff: Duration§max_duration: Duration§max_tries: usize

Implementations§

source§

impl Retry

source

pub(crate) fn project<'pin>( self: Pin<&'pin mut Self>, ) -> __RetryProjection<'pin>

source

pub(crate) fn project_ref<'pin>( self: Pin<&'pin Self>, ) -> __RetryProjectionRef<'pin>

source§

impl Retry

source

pub fn initial_backoff(self, initial_backoff: Duration) -> Self

Sets the initial backoff for the retry operation.

The initial backoff is the amount of time to wait if the first try fails.

source

pub fn clamp_backoff(self, clamp_backoff: Duration) -> Self

Clamps the maximum backoff for the retry operation.

The maximum backoff is the maximum amount of time to wait between tries.

source

pub fn factor(self, factor: f64) -> Self

Sets the exponential backoff factor for the retry operation.

The time to wait is multiplied by this factor after each failed try. The default factor is two.

source

pub fn max_tries(self, max_tries: usize) -> Self

Sets the maximum number of tries.

If the operation is still failing after max_tries, then retry will return the last error.

Calls to max_tries will override any previous calls to max_tries.

§Panics

Panics if max_tries is zero.

source

pub fn max_duration(self, duration: Duration) -> Self

Sets the maximum duration.

If the operation is still failing after the specified duration, then the operation will be retried once more and retry will return the last error.

Calls to max_duration will override any previous calls to max_duration.

source

pub fn retry<F, R, T, E>(self, f: F) -> Result<T, E>
where F: FnMut(RetryState) -> R, R: Into<RetryResult<T, E>>,

Retries the fallible operation f according to the configured policy.

The retry method invokes f repeatedly until it returns either RetryResult::Ok or RetryResult::FatalErr, or until the maximum duration or tries have been reached, as configured via max_duration or max_tries. If the last invocation of f returns RetryResult::Ok(t), then retry returns Ok(t). If the last invocation of f returns RetryResult::RetriableErr(e) or RetryResult::FatalErr(e), then retry returns Err(e).

As a convenience, f can return any type that is convertible to a RetryResult. The conversion from Result to RetryResult converts Err(e) to RetryResult::RetryableErr(e), that is, it considers all errors retryable.

After the first failure, retry sleeps for the initial backoff configured via initial_backoff. After each successive failure, retry sleeps for twice the last backoff. If the backoff would ever exceed the maximum backoff configured viq Retry::clamp_backoff, then the backoff is clamped to the specified maximum.

The operation does not attempt to forcibly time out f, even if there is a maximum duration. If there is the possibility of f blocking forever, consider adding a timeout internally.

source

pub async fn retry_async<F, U, R, T, E>(self, f: F) -> Result<T, E>
where F: FnMut(RetryState) -> U, U: Future<Output = R>, R: Into<RetryResult<T, E>>,

Like Retry::retry but for asynchronous operations.

source

pub async fn retry_async_canceling<F, U, T, E>(self, f: F) -> Result<T, E>
where F: FnMut(RetryState) -> U, U: Future<Output = Result<T, E>>, E: From<Elapsed> + Debug,

Like Retry::retry_async but the operation will be canceled if the maximum duration is reached.

Specifically, if the maximum duration is reached, the operation f will be forcibly canceled by dropping it. Canceling f can be surprising if the operation is not programmed to expect the possibility of not resuming from an await point; if you wish to always run f to completion, use Retry::retry_async instead.

If f is forcibly canceled, the error returned will be the error returned by the prior invocation of f. If there is no prior invocation of f, then an Elapsed error is returned. The idea is that if f fails three times in a row with a useful error message, and then the fourth attempt is canceled because the timeout is reached, the caller would rather see the useful error message from the third attempt, rather than the “deadline exceeded” message from the fourth attempt.

source

pub async fn retry_async_with_state<F, S, U, R, T, E>( self, user_state: S, f: F, ) -> (S, Result<T, E>)
where F: FnMut(RetryState, S) -> U, U: Future<Output = (S, R)>, R: Into<RetryResult<T, E>>,

Like Retry::retry_async but can pass around user specified state.

source

pub fn into_retry_stream(self) -> RetryStream

Convert into RetryStream

Trait Implementations§

source§

impl Debug for Retry

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Retry

source§

fn default() -> Self

Constructs a retry operation that will retry forever with backoff defaults that are reasonable for a fallible network operation.

source§

impl<'pin> Unpin for Retry
where __Retry<'pin>: Unpin,

Auto Trait Implementations§

§

impl Freeze for Retry

§

impl RefUnwindSafe for Retry

§

impl Send for Retry

§

impl Sync for Retry

§

impl UnwindSafe for Retry

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T, U> CastInto<U> for T
where U: CastFrom<T>,

source§

fn cast_into(self) -> U

Performs the cast.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FutureExt for T

source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
source§

impl<T> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,