use std::time::Duration;
const FAST_TRIES: u32 = 5;
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub struct Backoff {
tries: u32,
}
impl Backoff {
pub fn next_delay(&mut self, uptime: Duration, poll: Duration) -> Duration {
let poll_secs = poll.as_secs();
let min_time = (poll_secs / 10).max(10);
if uptime.as_secs() >= min_time {
self.tries = 0;
} else {
self.tries += 1;
}
if self.tries <= FAST_TRIES {
return Duration::ZERO;
}
let t = f64::from(self.tries - FAST_TRIES);
let n = ((poll_secs as f64 / 100.0) * (t * (t / 3.0))) as u64;
Duration::from_secs(n.min(poll_secs))
}
pub fn tries(&self) -> u32 {
self.tries
}
}