heliosdb_proxy/lag/
mod.rs1pub mod config;
45pub mod metrics;
46pub mod monitor;
47pub mod router;
48pub mod ryw;
49
50pub use config::{LagCalculation, LagRoutingConfig, SyncModeLagConfig};
52pub use metrics::{LagMetrics, LagStatsSnapshot, NodeLagStats};
53pub use monitor::{LagInfo, LagMonitor, LagTrend, NodeLagData};
54pub use router::{LagAwareRouter, LagRoutingDecision, LagRoutingReason};
55pub use ryw::{ReadYourWritesTracker, RywSession, WorkflowConsistency, WorkflowTracker};
56
57#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
59pub enum SyncMode {
60 Sync,
62 SemiSync,
64 Async,
66 #[default]
68 Unknown,
69}
70
71impl std::fmt::Display for SyncMode {
72 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
73 match self {
74 SyncMode::Sync => write!(f, "sync"),
75 SyncMode::SemiSync => write!(f, "semisync"),
76 SyncMode::Async => write!(f, "async"),
77 SyncMode::Unknown => write!(f, "unknown"),
78 }
79 }
80}
81
82impl std::str::FromStr for SyncMode {
83 type Err = String;
84
85 fn from_str(s: &str) -> Result<Self, Self::Err> {
86 match s.to_lowercase().as_str() {
87 "sync" | "synchronous" => Ok(SyncMode::Sync),
88 "semisync" | "semi-sync" | "semi_sync" => Ok(SyncMode::SemiSync),
89 "async" | "asynchronous" => Ok(SyncMode::Async),
90 "unknown" => Ok(SyncMode::Unknown),
91 _ => Err(format!("Unknown sync mode: {}", s)),
92 }
93 }
94}
95
96#[cfg(test)]
97mod tests {
98 use super::*;
99
100 #[test]
101 fn test_sync_mode_display() {
102 assert_eq!(SyncMode::Sync.to_string(), "sync");
103 assert_eq!(SyncMode::SemiSync.to_string(), "semisync");
104 assert_eq!(SyncMode::Async.to_string(), "async");
105 assert_eq!(SyncMode::Unknown.to_string(), "unknown");
106 }
107
108 #[test]
109 fn test_sync_mode_from_str() {
110 assert_eq!("sync".parse::<SyncMode>().unwrap(), SyncMode::Sync);
111 assert_eq!("synchronous".parse::<SyncMode>().unwrap(), SyncMode::Sync);
112 assert_eq!("semisync".parse::<SyncMode>().unwrap(), SyncMode::SemiSync);
113 assert_eq!("semi-sync".parse::<SyncMode>().unwrap(), SyncMode::SemiSync);
114 assert_eq!("async".parse::<SyncMode>().unwrap(), SyncMode::Async);
115 assert_eq!("asynchronous".parse::<SyncMode>().unwrap(), SyncMode::Async);
116 assert!("invalid".parse::<SyncMode>().is_err());
117 }
118}