diff options
author | Alex Auvolat <alex@adnab.me> | 2022-06-27 17:57:48 +0200 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2022-06-27 17:57:48 +0200 |
commit | 247dbcd5980e6a0158fe209d85788d3167dceab0 (patch) | |
tree | b5f9b20cb87ead9d5e8cfb70984f9795ad2e7712 /src/garage | |
parent | 0e5175abeeb1b2d9cfe27603005b7feb3cf040de (diff) | |
download | garage-247dbcd5980e6a0158fe209d85788d3167dceab0.tar.gz garage-247dbcd5980e6a0158fe209d85788d3167dceab0.zip |
Only one scrub worker (wip)
Diffstat (limited to 'src/garage')
-rw-r--r-- | src/garage/admin.rs | 2 | ||||
-rw-r--r-- | src/garage/cli/structs.rs | 25 | ||||
-rw-r--r-- | src/garage/repair/online.rs | 22 |
3 files changed, 38 insertions, 11 deletions
diff --git a/src/garage/admin.rs b/src/garage/admin.rs index de49331e..71ee608c 100644 --- a/src/garage/admin.rs +++ b/src/garage/admin.rs @@ -698,7 +698,7 @@ impl AdminRpcHandler { ))) } } else { - launch_online_repair(self.garage.clone(), opt); + launch_online_repair(self.garage.clone(), opt).await; Ok(AdminRpc::Ok(format!( "Repair launched on {:?}", self.garage.system.id diff --git a/src/garage/cli/structs.rs b/src/garage/cli/structs.rs index c1ee32ab..bc44b5ef 100644 --- a/src/garage/cli/structs.rs +++ b/src/garage/cli/structs.rs @@ -427,8 +427,29 @@ pub enum RepairWhat { /// Verify integrity of all blocks on disc (extremely slow, i/o intensive) #[structopt(name = "scrub")] Scrub { - /// Tranquility factor (see tranquilizer documentation) - #[structopt(name = "tranquility", default_value = "2")] + #[structopt(subcommand)] + cmd: ScrubCmd, + }, +} + +#[derive(Serialize, Deserialize, StructOpt, Debug, Eq, PartialEq, Clone)] +pub enum ScrubCmd { + /// Start scrub + #[structopt(name = "start")] + Start, + /// Pause scrub (it will resume automatically after 24 hours) + #[structopt(name = "pause")] + Pause, + /// Resume paused scrub + #[structopt(name = "resume")] + Resume, + /// Cancel scrub in progress + #[structopt(name = "cancel")] + Cancel, + /// Set tranquility level for in-progress and future scrubs + #[structopt(name = "set-tranquility")] + SetTranquility { + #[structopt()] tranquility: u32, }, } diff --git a/src/garage/repair/online.rs b/src/garage/repair/online.rs index b0437c5e..8207a8b4 100644 --- a/src/garage/repair/online.rs +++ b/src/garage/repair/online.rs @@ -1,8 +1,10 @@ use std::sync::Arc; +use std::time::Duration; use async_trait::async_trait; use tokio::sync::watch; +use garage_block::repair::ScrubWorkerCommand; use garage_model::garage::Garage; use garage_model::s3::block_ref_table::*; use garage_model::s3::object_table::*; @@ -13,7 +15,7 @@ use garage_util::error::Error; use crate::*; -pub fn launch_online_repair(garage: Arc<Garage>, opt: RepairOpt) { +pub async fn launch_online_repair(garage: Arc<Garage>, opt: RepairOpt) { match opt.what { RepairWhat::Tables => { info!("Launching a full sync of tables"); @@ -43,14 +45,18 @@ pub fn launch_online_repair(garage: Arc<Garage>, opt: RepairOpt) { garage.block_manager.clone(), )); } - RepairWhat::Scrub { tranquility } => { + RepairWhat::Scrub { cmd } => { info!("Verifying integrity of stored blocks"); - garage - .background - .spawn_worker(garage_block::repair::ScrubWorker::new( - garage.block_manager.clone(), - tranquility, - )); + let cmd = match cmd { + ScrubCmd::Start => ScrubWorkerCommand::Start, + ScrubCmd::Pause => ScrubWorkerCommand::Pause(Duration::from_secs(3600 * 24)), + ScrubCmd::Resume => ScrubWorkerCommand::Resume, + ScrubCmd::Cancel => ScrubWorkerCommand::Cancel, + ScrubCmd::SetTranquility { tranquility } => { + ScrubWorkerCommand::SetTranquility(tranquility) + } + }; + garage.block_manager.send_scrub_command(cmd).await; } } } |