use exponential_backoff::Backoff;
use std::fmt::Debug;
use std::time::Duration;
use super::Quorum;
#[derive(Clone, Debug, Copy, Default)]
#[repr(usize)]
pub enum RetryStrategy {
None = 1,
Once = 2,
Quick = 4,
#[default]
Balanced = 6,
Persistent = 10,
N(usize),
}
impl RetryStrategy {
pub fn attempts(&self) -> usize {
match self {
RetryStrategy::N(n) => *n,
RetryStrategy::None => 1,
RetryStrategy::Once => 2,
RetryStrategy::Quick => 4,
RetryStrategy::Balanced => 6,
RetryStrategy::Persistent => 10,
}
}
pub fn backoff(&self) -> Backoff {
let min_wait = Duration::from_secs(2);
let max_wait = Some(Duration::from_secs(8));
Backoff::new(self.attempts() as u32, min_wait, max_wait)
}
}
#[derive(Debug, Clone)]
pub struct Strategy {
pub put_quorum: Quorum,
pub put_retry: RetryStrategy,
pub verification_quorum: Quorum,
pub get_quorum: Quorum,
pub get_retry: RetryStrategy,
}