spiffe_rs/workloadapi/
backoff.rs

1use std::time::Duration;
2
3pub trait BackoffStrategy: Send + Sync {
4    fn new_backoff(&self) -> Box<dyn Backoff>;
5}
6
7pub trait Backoff: Send {
8    fn next(&mut self) -> Duration;
9    fn reset(&mut self);
10}
11
12#[derive(Default)]
13pub struct LinearBackoffStrategy;
14
15impl BackoffStrategy for LinearBackoffStrategy {
16    fn new_backoff(&self) -> Box<dyn Backoff> {
17        Box::new(LinearBackoff::new())
18    }
19}
20
21pub struct LinearBackoff {
22    initial_delay: Duration,
23    max_delay: Duration,
24    n: u64,
25}
26
27impl LinearBackoff {
28    pub fn new() -> Self {
29        Self {
30            initial_delay: Duration::from_secs(1),
31            max_delay: Duration::from_secs(30),
32            n: 0,
33        }
34    }
35}
36
37impl Backoff for LinearBackoff {
38    fn next(&mut self) -> Duration {
39        self.n += 1;
40        let backoff = self.initial_delay.as_secs_f64() * self.n as f64;
41        let secs = backoff.min(self.max_delay.as_secs_f64());
42        Duration::from_secs_f64(secs)
43    }
44
45    fn reset(&mut self) {
46        self.n = 0;
47    }
48}