spiffe_rs/workloadapi/
backoff.rs1use 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}