Rust capped exponential backoff retry helper
Rust
use std::thread::sleep;
use std::time::{Duration, SystemTime, UNIX_EPOCH};
fn with_retry<T, E, F>(mut op: F, attempts: u32) -> Result<T, E>
where
F: FnMut(u32) -> Result<T, E>,
{
let mut last: Option<E> = None;
for attempt in 0..attempts {
match op(attempt) {
Ok(value) => return Ok(value),
Err(err) => {
last = Some(err);
let base = 50u64 << attempt.min(6);
let jitter = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().subsec_nanos() as u64 % 50;
sleep(Duration::from_millis(base + jitter));
}
}
}
Err(last.expect("attempts must be greater than zero"))
}