common_meta/key/
maintenance.rs1use std::sync::Arc;
16
17use crate::error::Result;
18use crate::key::MAINTENANCE_KEY;
19use crate::kv_backend::KvBackendRef;
20use crate::rpc::store::PutRequest;
21
22pub type MaintenanceModeManagerRef = Arc<MaintenanceModeManager>;
23
24#[derive(Clone)]
28pub struct MaintenanceModeManager {
29 kv_backend: KvBackendRef,
30}
31
32impl MaintenanceModeManager {
33 pub fn new(kv_backend: KvBackendRef) -> Self {
34 Self { kv_backend }
35 }
36
37 pub async fn set_maintenance_mode(&self) -> Result<()> {
39 let req = PutRequest {
40 key: Vec::from(MAINTENANCE_KEY),
41 value: vec![],
42 prev_kv: false,
43 };
44 self.kv_backend.put(req).await?;
45 Ok(())
46 }
47
48 pub async fn unset_maintenance_mode(&self) -> Result<()> {
50 self.kv_backend
51 .delete(MAINTENANCE_KEY.as_bytes(), false)
52 .await?;
53 Ok(())
54 }
55
56 pub async fn maintenance_mode(&self) -> Result<bool> {
58 self.kv_backend.exists(MAINTENANCE_KEY.as_bytes()).await
59 }
60}
61
62#[cfg(test)]
63mod tests {
64 use std::sync::Arc;
65
66 use crate::key::maintenance::MaintenanceModeManager;
67 use crate::kv_backend::memory::MemoryKvBackend;
68
69 #[tokio::test]
70 async fn test_maintenance_mode_manager() {
71 let maintenance_mode_manager = Arc::new(MaintenanceModeManager::new(Arc::new(
72 MemoryKvBackend::new(),
73 )));
74 assert!(!maintenance_mode_manager.maintenance_mode().await.unwrap());
75 maintenance_mode_manager
76 .set_maintenance_mode()
77 .await
78 .unwrap();
79 assert!(maintenance_mode_manager.maintenance_mode().await.unwrap());
80 maintenance_mode_manager
81 .unset_maintenance_mode()
82 .await
83 .unwrap();
84 assert!(!maintenance_mode_manager.maintenance_mode().await.unwrap());
85 }
86}