use std::time::Duration;
use tracing::trace;
use crate::{Error, Result};
pub struct RetryState {
cnt: u64,
interval: Duration,
}
impl Default for RetryState {
fn default() -> Self {
RetryState::new(30, Duration::from_millis(200))
}
}
impl RetryState {
pub fn new(cnt: u64, interval: Duration) -> Self {
Self { cnt, interval }
}
pub async fn retry(&mut self, err: Error) -> Result<()> {
match err {
Error::NotFound(_) | Error::EpochNotMatch(_) => {
self.cnt -= 1;
trace!("retry state cnt {}", self.cnt);
if self.cnt == 0 {
return Err(Error::DeadlineExceeded("timeout".into()));
}
tokio::time::sleep(self.interval).await;
Ok(())
}
Error::NotLeader(..) | Error::GroupNotFound(_) | Error::NotRootLeader(..) => {
unreachable!()
}
Error::InvalidArgument(_)
| Error::DeadlineExceeded(_)
| Error::ResourceExhausted(_)
| Error::AlreadyExists(_)
| Error::Rpc(_)
| Error::Internal(_) => Err(err),
}
}
}