From df540dd43b1341f8eee39739105de7f1bb88cc1b Mon Sep 17 00:00:00 2001 From: timeshifter Date: Sun, 3 May 2026 15:21:15 +0200 Subject: [PATCH] fix scrub logic --- src/cmd/zfs.rs | 8 +++++++- src/zfs.rs | 10 +++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/cmd/zfs.rs b/src/cmd/zfs.rs index 67d9823..d0ec9cd 100644 --- a/src/cmd/zfs.rs +++ b/src/cmd/zfs.rs @@ -21,10 +21,16 @@ pub fn zpool_scrub(pool_name: &str) -> Result<()> { run_command("zpool", vec!["scrub", pool_name]) } -pub fn zpool_wait_scrub(pool_name: &str) -> Result<()> { +pub fn zpool_wait_scrub_complete(pool_name: &str) -> Result<()> { run_command("zpool", vec!["wait", "-t", "scrub", pool_name]) } +pub(crate) fn zpool_scrub_in_progress(pool_name: &str) -> Result { + let output = get_output("zpool", vec!["status", pool_name])?; + let string = String::from_utf8(output.stdout)?; + Ok(string.contains("scrub in progress")) +} + pub fn zpool_status(pool_name: &str) -> Result { let output = get_output("zpool", vec!["status", pool_name])?; let status = String::from_utf8(output.stdout)?; diff --git a/src/zfs.rs b/src/zfs.rs index 60b3e32..5dcb2cc 100644 --- a/src/zfs.rs +++ b/src/zfs.rs @@ -95,7 +95,15 @@ impl ZPool { } pub fn scrub(&self) -> Result<()> { - zpool_scrub(&self.name) + let name = &self.name; + + if !zpool_scrub_in_progress(&self.name)? { + println!("scrubbing {name}"); + zpool_scrub(&self.name)?; + } + + println!("waiting for scrub to complete"); + zpool_wait_scrub_complete(&self.name) } pub fn import(name: &str) -> Result {