Skip to content

Simple wrapper for failable futures allowing easily write any custom retry logic.

Notifications You must be signed in to change notification settings

arsenron/retry_future

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

39 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Retry Future

The main purpose of the crate is to retry Futures which may contain complex scenarios such as not only handling errors but anything that should be retried. This may include retrying 500's errors from http requests or retrying something like "pseudo" successes from grpc requests.

For examples, please check examples/ dir, but here is one:

// imports...
use retry_future::{
    RetryFuture, RetryPolicy, ExponentialRetryStrategy, Error
};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let resp = RetryFuture::new(
        || async {
            let resp = reqwest::get("http://localhost:8080").await?;
            match resp.status() {
                StatusCode::OK => Ok(resp),
                StatusCode::BAD_REQUEST | StatusCode::FORBIDDEN => Err(RetryPolicy::Fail(
                    String::from("Cannot recover from these kind of errors ._."),
                )),
                StatusCode::INTERNAL_SERVER_ERROR => Err(RetryPolicy::Retry(None)),
                StatusCode::UNAUTHORIZED => {
                    // What if authorization server lies us?! Retry it to be convinced
                    let maybe_response_text = resp.text().await.ok().map(Error::msg);  // debug info
                    Err(RetryPolicy::Retry(maybe_response_text))
                }
                _ => Err(RetryPolicy::Fail(format!("Some unusual response here: {resp:?}"))),
            }
        },
        ExponentialRetryStrategy::new()
            .max_attempts(5)
            .initial_delay(Duration::from_millis(100))
            .retry_early_returned_errors(true),
    )
        .await?;

    eprintln!("resp = {:#?}", resp);

    Ok(())
}

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

About

Simple wrapper for failable futures allowing easily write any custom retry logic.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages