use std::time::Instant;
use serde::{Deserialize, Serialize};
use crate::replication::{AckTracker, QuorumError, QuorumFailureReason};
pub fn finalise_quorum(tracker: &AckTracker) -> Result<usize, QuorumError> {
tracker.finalise(Instant::now())
}
const QUORUM_NOT_MET: &str = "quorum_not_met";
#[derive(Debug, Serialize, Deserialize)]
pub struct QuorumNotMetPayload {
pub error: &'static str,
pub got: usize,
pub needed: usize,
pub reason: String,
}
impl QuorumNotMetPayload {
#[must_use]
pub fn from_err(err: &QuorumError) -> Self {
match err {
QuorumError::QuorumNotMet {
got,
needed,
reason,
} => Self {
error: QUORUM_NOT_MET,
got: *got,
needed: *needed,
reason: match reason {
QuorumFailureReason::Unreachable => "unreachable".to_string(),
QuorumFailureReason::Timeout | QuorumFailureReason::InFlight => {
"timeout".to_string()
}
QuorumFailureReason::IdDrift => "id_drift".to_string(),
},
},
QuorumError::InvalidPolicy { detail } => Self {
error: QUORUM_NOT_MET,
got: 0,
needed: 0,
reason: format!("invalid_policy:{detail}"),
},
QuorumError::LocalWriteFailed { detail } => Self {
error: QUORUM_NOT_MET,
got: 0,
needed: 0,
reason: format!("local_write_failed:{detail}"),
},
}
}
}