From a37a18c2d974f5b3ebde4834d5bb0a9b33a31283 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sat, 8 Oct 2022 22:16:45 -0700 Subject: [PATCH] Optimize deleting leafs in subtasks This finally beats the shitty implementation I posted here: https://github.com/tokio-rs/tokio/issues/4172#issuecomment-945052350 Signed-off-by: Alex Saveau --- fuc_engine/src/ops/remove.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/fuc_engine/src/ops/remove.rs b/fuc_engine/src/ops/remove.rs index c660b10..b1d88e6 100644 --- a/fuc_engine/src/ops/remove.rs +++ b/fuc_engine/src/ops/remove.rs @@ -73,7 +73,7 @@ async fn run_deletion_scheduler<'a, F: IntoIterator>( } } - for dir in dirs.into_iter().rev() { + for dir in dirs.into_iter().rev().flatten() { fs::remove_dir(&dir).map_err(|error| Error::Io { error, context: format!("Failed to delete directory: {dir:?}"), @@ -85,8 +85,10 @@ async fn run_deletion_scheduler<'a, F: IntoIterator>( fn delete_dir( dir: PathBuf, - tasks: UnboundedSender>>, -) -> Result { + tasks: UnboundedSender, Error>>>, +) -> Result, Error> { + let mut has_children = false; + // TODO use getdents64 on linux let files = fs::read_dir(&dir).map_err(|error| Error::Io { error, @@ -105,6 +107,7 @@ fn delete_dir( })? .is_dir(); + has_children |= is_dir; if is_dir { tasks .send(task::spawn_blocking({ @@ -121,5 +124,13 @@ fn delete_dir( } } - Ok(dir) + if has_children { + Ok(Some(dir)) + } else { + fs::remove_dir(&dir).map_err(|error| Error::Io { + error, + context: format!("Failed to delete directory: {dir:?}"), + })?; + Ok(None) + } }