use crate::store::stats::HlcPoint;
#[derive(Debug)]
#[non_exhaustive]
pub enum StoreInvariant {
CloseHlcRegression {
previous: HlcPoint,
later: HlcPoint,
},
BootstrapHlcOutOfOrder {
open_hlc: HlcPoint,
max_recovered_hlc: HlcPoint,
last_close_hlc: HlcPoint,
},
OpenHlcWallMsOverflow {
wall_ms: u64,
},
OpenHlcTimestampOutOfRange {
wall_ms: u64,
},
OpenReceiptNotIndexed {
event_id: u128,
},
GateReceiptNotIndexed {
event_id: u128,
},
PreparedBatchItemCountDrift {
expected: usize,
actual: usize,
},
}
impl std::fmt::Display for StoreInvariant {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::CloseHlcRegression { previous, later } => write!(
f,
"SYSTEM_CLOSE_COMPLETED HLC regressed in log order: previous {previous:?}, later {later:?}"
),
Self::BootstrapHlcOutOfOrder {
open_hlc,
max_recovered_hlc,
last_close_hlc,
} => write!(
f,
"open_hlc {open_hlc:?} must be >= max_recovered_hlc {max_recovered_hlc:?} and last_close_hlc {last_close_hlc:?}"
),
Self::OpenHlcWallMsOverflow { wall_ms } => {
write!(f, "open_hlc wall_ms {wall_ms} overflows timestamp_us")
}
Self::OpenHlcTimestampOutOfRange { wall_ms } => write!(
f,
"open_hlc wall_ms {wall_ms} exceeds i64 timestamp_us range"
),
Self::OpenReceiptNotIndexed { event_id } => write!(
f,
"SYSTEM_OPEN_COMPLETED receipt {event_id:032x} was not visible in the rebuilt index"
),
Self::GateReceiptNotIndexed { event_id } => write!(
f,
"append receipt {event_id:032x} was not visible for durability gate lookup"
),
Self::PreparedBatchItemCountDrift { expected, actual } => write!(
f,
"prepared batch item count changed during staging: expected {expected}, got {actual}"
),
}
}
}