From 27971f5c037ffa8af00699c249992ccc1d834bc0 Mon Sep 17 00:00:00 2001 From: weisd Date: Wed, 15 Apr 2026 15:32:13 +0800 Subject: [PATCH] fix(scanner): preserve totals for compacted folder scans (#2530) --- crates/scanner/src/scanner_folder.rs | 75 +++++++++++++++------------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/crates/scanner/src/scanner_folder.rs b/crates/scanner/src/scanner_folder.rs index a45bdb1ad..f3b6a2f70 100644 --- a/crates/scanner/src/scanner_folder.rs +++ b/crates/scanner/src/scanner_folder.rs @@ -858,21 +858,22 @@ impl FolderScanner { (self.update_current_path)(&folder_item.name).await; - let mut dst = if !into.compacted { - DataUsageEntry::default() + if into.compacted { + // In compacted mode child totals are accumulated directly into the parent entry. + let fut = Box::pin(self.scan_folder(ctx.clone(), folder_item.clone(), into)); + fut.await.map_err(|e| ScannerError::Other(e.to_string()))?; + tokio::task::yield_now().await; } else { - into.clone() - }; + let mut dst = DataUsageEntry::default(); - // Use Box::pin for recursive async call - let fut = Box::pin(self.scan_folder(ctx.clone(), folder_item.clone(), &mut dst)); - if let Err(e) = fut.await { - warn!("scan_folder: failed to scan child folder {}: {}", folder_item.name, e); - continue; - } - tokio::task::yield_now().await; + // Use Box::pin for recursive async call + let fut = Box::pin(self.scan_folder(ctx.clone(), folder_item.clone(), &mut dst)); + if let Err(e) = fut.await { + warn!("scan_folder: failed to scan child folder {}: {}", folder_item.name, e); + continue; + } + tokio::task::yield_now().await; - if !into.compacted { let h = DataUsageHash(folder_item.name.clone()); into.add_child(&h); // We scanned a folder, optionally send update. @@ -910,21 +911,22 @@ impl FolderScanner { (self.update_current_path)(&folder_item.name).await; - let mut dst = if !into.compacted { - DataUsageEntry::default() + if into.compacted { + // In compacted mode child totals are accumulated directly into the parent entry. + let fut = Box::pin(self.scan_folder(ctx.clone(), folder_item.clone(), into)); + fut.await.map_err(|e| ScannerError::Other(e.to_string()))?; + tokio::task::yield_now().await; } else { - into.clone() - }; + let mut dst = DataUsageEntry::default(); - // Use Box::pin for recursive async call - let fut = Box::pin(self.scan_folder(ctx.clone(), folder_item.clone(), &mut dst)); - if let Err(e) = fut.await { - warn!("scan_folder: failed to scan child folder {}: {}", folder_item.name, e); - continue; - } - tokio::task::yield_now().await; + // Use Box::pin for recursive async call + let fut = Box::pin(self.scan_folder(ctx.clone(), folder_item.clone(), &mut dst)); + if let Err(e) = fut.await { + warn!("scan_folder: failed to scan child folder {}: {}", folder_item.name, e); + continue; + } + tokio::task::yield_now().await; - if !into.compacted { let h = DataUsageHash(folder_item.name.clone()); into.add_child(&h); // We scanned a folder, optionally send update. @@ -1124,21 +1126,22 @@ impl FolderScanner { object_heal_prob_div: 1, }; - let mut dst = if !into.compacted { - DataUsageEntry::default() + if into.compacted { + // In compacted mode child totals are accumulated directly into the parent entry. + let fut = Box::pin(self.scan_folder(ctx.clone(), folder_item.clone(), into)); + fut.await.map_err(|e| ScannerError::Other(e.to_string()))?; + tokio::task::yield_now().await; } else { - into.clone() - }; + let mut dst = DataUsageEntry::default(); - // Use Box::pin for recursive async call - let fut = Box::pin(self.scan_folder(ctx.clone(), folder_item.clone(), &mut dst)); - if let Err(e) = fut.await { - warn!("scan_folder: failed to scan child folder {}: {}", folder_item.name, e); - continue; - } - tokio::task::yield_now().await; + // Use Box::pin for recursive async call + let fut = Box::pin(self.scan_folder(ctx.clone(), folder_item.clone(), &mut dst)); + if let Err(e) = fut.await { + warn!("scan_folder: failed to scan child folder {}: {}", folder_item.name, e); + continue; + } + tokio::task::yield_now().await; - if !into.compacted { let h = DataUsageHash(folder_item.name.clone()); into.add_child(&h); // We scanned a folder, optionally send update.