Struct RetryLayer

Source
pub struct RetryLayer<I: RetryInterceptor = DefaultRetryInterceptor> { /* private fields */ }
Expand description

Add retry for temporary failed operations.

§Notes

This layer will retry failed operations when Error::is_temporary returns true. If operation still failed, this layer will set error to Persistent which means error has been retried.

§Panics

While retrying Reader or Writer operations, please make sure either:

  • All futures generated by Reader::read or Writer::close are resolved to Ready.
  • Or, won’t call any Reader or Writer methods after retry returns final error.

Otherwise, RetryLayer could panic while hitting in bad states.

For example, while composing RetryLayer with TimeoutLayer. The order of layer is sensitive.



let op = Operator::new(services::Memory::default())?
    // This is fine, since timeout happen during retry.
    .layer(TimeoutLayer::new().with_io_timeout(Duration::from_nanos(1)))
    .layer(RetryLayer::new())
    // This is wrong. Since timeout layer will drop future, leaving retry layer in a bad state.
    .layer(TimeoutLayer::new().with_io_timeout(Duration::from_nanos(1)))
    .finish();
Ok(())

§Examples


let _ = Operator::new(services::Memory::default())?
    .layer(RetryLayer::new())
    .finish();
Ok(())

§Customize retry interceptor

RetryLayer accepts RetryInterceptor to allow users to customize their own retry interceptor logic.



struct MyRetryInterceptor;

impl RetryInterceptor for MyRetryInterceptor {
    fn intercept(&self, err: &Error, dur: Duration) {
        // do something
    }
}

let _ = Operator::new(services::Memory::default())?
    .layer(RetryLayer::new().with_notify(MyRetryInterceptor))
    .finish();
Ok(())

Implementations§

Source§

impl RetryLayer

Source

pub fn new() -> RetryLayer

Create a new retry layer.

§Examples
use anyhow::Result;
use opendal::layers::RetryLayer;
use opendal::services;
use opendal::Operator;
use opendal::Scheme;

let _ = Operator::new(services::Memory::default())
    .expect("must init")
    .layer(RetryLayer::new());
Source§

impl<I: RetryInterceptor> RetryLayer<I>

Source

pub fn with_notify<NI: RetryInterceptor>(self, notify: NI) -> RetryLayer<NI>

Set the retry interceptor as new notify.

use opendal::layers::RetryLayer;
use opendal::services;
use opendal::Operator;

fn notify(_err: &opendal::Error, _dur: std::time::Duration) {}

let _ = Operator::new(services::Memory::default())
    .expect("must init")
    .layer(RetryLayer::new().with_notify(notify))
    .finish();
Source

pub fn with_jitter(self) -> Self

Set jitter of current backoff.

If jitter is enabled, ExponentialBackoff will add a random jitter in `[0, min_delay) to current delay.

Source

pub fn with_factor(self, factor: f32) -> Self

Set factor of current backoff.

§Panics

This function will panic if input factor smaller than 1.0.

Source

pub fn with_min_delay(self, min_delay: Duration) -> Self

Set min_delay of current backoff.

Source

pub fn with_max_delay(self, max_delay: Duration) -> Self

Set max_delay of current backoff.

Delay will not increase if current delay is larger than max_delay.

Source

pub fn with_max_times(self, max_times: usize) -> Self

Set max_times of current backoff.

Backoff will return None if max times is reaching.

Trait Implementations§

Source§

impl<I: RetryInterceptor> Clone for RetryLayer<I>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Default for RetryLayer

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<A: Access, I: RetryInterceptor> Layer<A> for RetryLayer<I>

Source§

type LayeredAccess = RetryAccessor<A, I>

The layered accessor that returned by this layer.
Source§

fn layer(&self, inner: A) -> Self::LayeredAccess

Intercept the operations on the underlying storage.

Auto Trait Implementations§

§

impl<I> Freeze for RetryLayer<I>

§

impl<I> RefUnwindSafe for RetryLayer<I>
where I: RefUnwindSafe,

§

impl<I> Send for RetryLayer<I>

§

impl<I> Sync for RetryLayer<I>

§

impl<I> Unpin for RetryLayer<I>

§

impl<I> UnwindSafe for RetryLayer<I>
where I: RefUnwindSafe,

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ServiceExt for T

Source§

fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>
where Self: Sized,

Apply a transformation to the response body. Read more
Source§

fn decompression(self) -> Decompression<Self>
where Self: Sized,

Decompress response bodies. Read more
Source§

fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using HTTP status codes. Read more
Source§

fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using gRPC headers. Read more
Source§

fn follow_redirects(self) -> FollowRedirect<Self>
where Self: Sized,

Follow redirect resposes using the Standard policy. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

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>,

Source§

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> MaybeSend for T
where T: Send,