use std::time::{Duration, Instant};
use super::{CasExecutionOutcome, CasExecutionReport};
#[derive(Debug, Clone)]
pub(crate) struct CasReportBuilder {
started_at: Instant,
conflicts: u32,
retry_errors: u32,
aborts: u32,
timeouts: u32,
}
impl CasReportBuilder {
#[inline]
pub(crate) fn start() -> Self {
Self {
started_at: Instant::now(),
conflicts: 0,
retry_errors: 0,
aborts: 0,
timeouts: 0,
}
}
#[inline]
pub(crate) fn started_at(&self) -> Instant {
self.started_at
}
#[inline]
pub(crate) fn record_conflict(&mut self) {
self.conflicts = self.conflicts.saturating_add(1);
}
#[inline]
pub(crate) fn record_retry_error(&mut self) {
self.retry_errors = self.retry_errors.saturating_add(1);
}
#[inline]
pub(crate) fn record_abort(&mut self) {
self.aborts = self.aborts.saturating_add(1);
}
#[inline]
pub(crate) fn record_timeout(&mut self) {
self.timeouts = self.timeouts.saturating_add(1);
}
#[inline]
pub(crate) fn finish(
&self,
attempts_total: u32,
max_attempts: u32,
max_elapsed: Option<Duration>,
outcome: CasExecutionOutcome,
) -> CasExecutionReport {
CasExecutionReport::new(
attempts_total,
self.conflicts,
self.retry_errors,
self.aborts,
self.timeouts,
self.started_at,
Instant::now(),
max_attempts,
max_elapsed,
outcome,
)
}
}