#[cfg(test)]
use crate::msg::MsgType;
use crate::msg::{ConsistencyLevel, DynErrorCode, Msg, ResponseMgr};
#[derive(Debug)]
pub enum RepairOutcome {
NoOp,
Rewritten(Box<Msg>),
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, thiserror::Error)]
#[non_exhaustive]
pub enum RepairError {
#[error("memcache repair: reserved")]
Reserved,
}
pub fn memcache_rewrite_query(_orig: &mut Msg) -> Result<RepairOutcome, RepairError> {
Ok(RepairOutcome::NoOp)
}
pub fn memcache_rewrite_query_with_timestamp_md(
_orig: &mut Msg,
) -> Result<RepairOutcome, RepairError> {
Ok(RepairOutcome::NoOp)
}
pub fn memcache_make_repair_query(_rspmgr: &ResponseMgr) -> Result<RepairOutcome, RepairError> {
Ok(RepairOutcome::NoOp)
}
pub fn memcache_clear_repair_md_for_key(_req: &mut Msg) -> Result<RepairOutcome, RepairError> {
Ok(RepairOutcome::NoOp)
}
pub fn memcache_reconcile_responses(
_rspmgr: &ResponseMgr,
consistency: ConsistencyLevel,
) -> ReconcileOutcome {
match consistency {
ConsistencyLevel::DcQuorum => ReconcileOutcome::PickFirst,
_ => ReconcileOutcome::Error(DynErrorCode::DynomiteNoQuorumAchieved),
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum ReconcileOutcome {
PickFirst,
Error(DynErrorCode),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn rewrite_is_noop() {
let mut m = Msg::new(0, MsgType::ReqMcSet, true);
let outcome = memcache_rewrite_query(&mut m).unwrap();
assert!(matches!(outcome, RepairOutcome::NoOp));
}
#[test]
fn reconcile_quorum_picks_first() {
let req = Msg::new(0, MsgType::ReqMcGet, true);
let mgr = ResponseMgr::new(&req, 3, None);
let outcome = memcache_reconcile_responses(&mgr, ConsistencyLevel::DcQuorum);
assert_eq!(outcome, ReconcileOutcome::PickFirst);
}
#[test]
fn reconcile_safe_quorum_emits_error() {
let req = Msg::new(0, MsgType::ReqMcGet, true);
let mgr = ResponseMgr::new(&req, 3, None);
let outcome = memcache_reconcile_responses(&mgr, ConsistencyLevel::DcSafeQuorum);
assert_eq!(
outcome,
ReconcileOutcome::Error(DynErrorCode::DynomiteNoQuorumAchieved),
);
}
}