5 unstable releases
0.3.4 | May 17, 2023 |
---|---|
0.3.2 | Sep 23, 2022 |
0.3.1 | Nov 13, 2021 |
0.2.0 | May 13, 2021 |
0.1.0 | Mar 5, 2021 |
#656 in Network programming
96 downloads per month
Used in 5 crates
(4 directly)
29KB
555 lines
Retry
Provides generic retry functions.
lib.rs
:
Retry is a crate for retrying something that can fail with exponential backoff. It is designed to have a declarative interface for ease of use. It can be used as follows:
# use pravega_client_retry::retry_policy::RetryWithBackoff;
# use pravega_client_retry::retry_result::RetryResult;
# use pravega_client_retry::retry_sync::retry_sync;
# use snafu::Snafu;
#[derive(Debug, PartialEq, Eq, Snafu)]
pub enum SnafuError {
#[snafu(display("Retryable error"))]
Retryable,
#[snafu(display("NonRetryable error"))]
Nonretryable,
}
let retry_policy = RetryWithBackoff::default_setting().max_tries(1);
let mut collection = vec![1, 2].into_iter();
let value = retry_sync(retry_policy, || match collection.next() {
Some(n) if n == 2 => RetryResult::Success(n),
Some(_) => RetryResult::Retry(SnafuError::Retryable),
None => RetryResult::Fail(SnafuError::Nonretryable),
}).unwrap();
assert_eq!(value, 2);
The above will retry the code 1 times if it throws Err(Retry::Retry). If it throws a Err(Retry::Err) or returns successfully it will return immediately. The delay following each of the filed attempts would be 1, 10,respectively. If all retries fail, it will return Err(RetryErr) that has error message.
Dependencies
~3.5–8.5MB
~143K SLoC