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 {