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.