use crate::msg::{ConsistencyLevel, DynErrorCode, MsgType, ResponseMgr};
use super::super::multikey::redis_is_multikey_request;
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum ReconcileOutcome {
QuorumOk,
PickFirst,
Error(DynErrorCode),
}
pub fn redis_reconcile_responses(
rspmgr: &ResponseMgr,
consistency: ConsistencyLevel,
) -> ReconcileOutcome {
let ty = rspmgr.msg_type();
if redis_is_multikey_request(ty) {
if matches!(consistency, ConsistencyLevel::DcQuorum) {
return ReconcileOutcome::PickFirst;
}
return ReconcileOutcome::Error(DynErrorCode::DynomiteNoQuorumAchieved);
}
match consistency {
ConsistencyLevel::DcQuorum => ReconcileOutcome::PickFirst,
_ => ReconcileOutcome::Error(DynErrorCode::DynomiteNoQuorumAchieved),
}
}
#[must_use]
pub fn is_foldable_multikey_response(ty: MsgType) -> bool {
matches!(
ty,
MsgType::RspRedisInteger | MsgType::RspRedisMultibulk | MsgType::RspRedisStatus
)
}