mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-08-12 09:19:44 +00:00
feat: allow igoring nonexistent regions in recovery mode (#6592)
* feat: allow ignoring nonexistent regions Signed-off-by: WenyXu <wenymedia@gmail.com> * feat: ignore nonexistent regions during startup in recovery mode Signed-off-by: WenyXu <wenymedia@gmail.com> * feat: allow enabling recovery mode via http api Signed-off-by: WenyXu <wenymedia@gmail.com> --------- Signed-off-by: WenyXu <wenymedia@gmail.com>
This commit is contained in:
@@ -167,6 +167,7 @@ pub const NAME_PATTERN: &str = r"[a-zA-Z_:-][a-zA-Z0-9_:\-\.@#]*";
|
||||
pub const LEGACY_MAINTENANCE_KEY: &str = "__maintenance";
|
||||
pub const MAINTENANCE_KEY: &str = "__switches/maintenance";
|
||||
pub const PAUSE_PROCEDURE_KEY: &str = "__switches/pause_procedure";
|
||||
pub const RECOVERY_MODE_KEY: &str = "__switches/recovery";
|
||||
|
||||
pub const DATANODE_TABLE_KEY_PREFIX: &str = "__dn_table";
|
||||
pub const TABLE_INFO_KEY_PREFIX: &str = "__table_info";
|
||||
|
||||
@@ -21,7 +21,7 @@ use moka::future::Cache;
|
||||
use snafu::ResultExt;
|
||||
|
||||
use crate::error::{GetCacheSnafu, Result};
|
||||
use crate::key::{LEGACY_MAINTENANCE_KEY, MAINTENANCE_KEY, PAUSE_PROCEDURE_KEY};
|
||||
use crate::key::{LEGACY_MAINTENANCE_KEY, MAINTENANCE_KEY, PAUSE_PROCEDURE_KEY, RECOVERY_MODE_KEY};
|
||||
use crate::kv_backend::KvBackendRef;
|
||||
use crate::rpc::store::{BatchDeleteRequest, PutRequest};
|
||||
|
||||
@@ -131,6 +131,21 @@ impl RuntimeSwitchManager {
|
||||
pub async fn is_procedure_paused(&self) -> Result<bool> {
|
||||
self.exists(PAUSE_PROCEDURE_KEY).await
|
||||
}
|
||||
|
||||
/// Enables recovery mode.
|
||||
pub async fn set_recovery_mode(&self) -> Result<()> {
|
||||
self.put_key(RECOVERY_MODE_KEY).await
|
||||
}
|
||||
|
||||
/// Unsets recovery mode.
|
||||
pub async fn unset_recovery_mode(&self) -> Result<()> {
|
||||
self.delete_keys(&[RECOVERY_MODE_KEY]).await
|
||||
}
|
||||
|
||||
/// Returns true if the system is currently in recovery mode.
|
||||
pub async fn recovery_mode(&self) -> Result<bool> {
|
||||
self.exists(RECOVERY_MODE_KEY).await
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -221,4 +236,15 @@ mod tests {
|
||||
runtime_switch_manager.resume_procedure().await.unwrap();
|
||||
assert!(!runtime_switch_manager.is_procedure_paused().await.unwrap());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_recovery_mode() {
|
||||
let runtime_switch_manager =
|
||||
Arc::new(RuntimeSwitchManager::new(Arc::new(MemoryKvBackend::new())));
|
||||
assert!(!runtime_switch_manager.recovery_mode().await.unwrap());
|
||||
runtime_switch_manager.set_recovery_mode().await.unwrap();
|
||||
assert!(runtime_switch_manager.recovery_mode().await.unwrap());
|
||||
runtime_switch_manager.unset_recovery_mode().await.unwrap();
|
||||
assert!(!runtime_switch_manager.recovery_mode().await.unwrap());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user