pub mod config;
pub mod metrics;
pub mod monitor;
pub mod router;
pub mod ryw;
pub use config::{
LagCalculation, LagRoutingConfig, SyncModeLagConfig,
};
pub use metrics::{
LagMetrics, LagStatsSnapshot, NodeLagStats,
};
pub use monitor::{
LagInfo, LagMonitor, LagTrend, NodeLagData,
};
pub use router::{
LagAwareRouter, LagRoutingDecision, LagRoutingReason,
};
pub use ryw::{
ReadYourWritesTracker, RywSession, WorkflowConsistency, WorkflowTracker,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SyncMode {
Sync,
SemiSync,
Async,
Unknown,
}
impl Default for SyncMode {
fn default() -> Self {
Self::Unknown
}
}
impl std::fmt::Display for SyncMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
SyncMode::Sync => write!(f, "sync"),
SyncMode::SemiSync => write!(f, "semisync"),
SyncMode::Async => write!(f, "async"),
SyncMode::Unknown => write!(f, "unknown"),
}
}
}
impl std::str::FromStr for SyncMode {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"sync" | "synchronous" => Ok(SyncMode::Sync),
"semisync" | "semi-sync" | "semi_sync" => Ok(SyncMode::SemiSync),
"async" | "asynchronous" => Ok(SyncMode::Async),
"unknown" => Ok(SyncMode::Unknown),
_ => Err(format!("Unknown sync mode: {}", s)),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sync_mode_display() {
assert_eq!(SyncMode::Sync.to_string(), "sync");
assert_eq!(SyncMode::SemiSync.to_string(), "semisync");
assert_eq!(SyncMode::Async.to_string(), "async");
assert_eq!(SyncMode::Unknown.to_string(), "unknown");
}
#[test]
fn test_sync_mode_from_str() {
assert_eq!("sync".parse::<SyncMode>().unwrap(), SyncMode::Sync);
assert_eq!("synchronous".parse::<SyncMode>().unwrap(), SyncMode::Sync);
assert_eq!("semisync".parse::<SyncMode>().unwrap(), SyncMode::SemiSync);
assert_eq!("semi-sync".parse::<SyncMode>().unwrap(), SyncMode::SemiSync);
assert_eq!("async".parse::<SyncMode>().unwrap(), SyncMode::Async);
assert_eq!("asynchronous".parse::<SyncMode>().unwrap(), SyncMode::Async);
assert!("invalid".parse::<SyncMode>().is_err());
}
}