perf: parallelize WebDAV PROPFIND queries with tokio::join!

- Root PROPFIND: list_folders + list_files now run concurrently
- Sub-folder PROPFIND: list_files + list_folders now run concurrently
- ~50% latency reduction on every PROPFIND operation
- Matches existing pattern used in folder_handler::list_folder_listing
This commit is contained in:
Dionisio
2026-02-23 22:19:41 +01:00
parent a7e12ce0f7
commit 363ec33fc2
+18 -26
View File
@@ -202,15 +202,14 @@ async fn handle_propfind(
// Check if path exists as a file or folder
if path.is_empty() || path == "/" {
// Root folder
let subfolders = folder_service
.list_folders(None)
.await
// Root folder — run both queries concurrently
let (subfolders_result, files_result) = tokio::join!(
folder_service.list_folders(None),
file_retrieval_service.list_files(None)
);
let subfolders = subfolders_result
.map_err(|e| AppError::internal_error(format!("Failed to get subfolders: {}", e)))?;
let files = file_retrieval_service
.list_files(None)
.await
let files = files_result
.map_err(|e| AppError::internal_error(format!("Failed to get files: {}", e)))?;
// Create root folder DTO for response
@@ -253,25 +252,18 @@ async fn handle_propfind(
let folder_result = folder_service.get_folder_by_path(&path).await;
if let Ok(folder) = folder_result {
// Path is a folder
let files = if depth != "0" {
file_retrieval_service
.list_files(Some(&folder.id))
.await
.map_err(|e| AppError::internal_error(format!("Failed to get files: {}", e)))?
// Path is a folder — run both queries concurrently
let (files, subfolders) = if depth != "0" {
let (files_r, folders_r) = tokio::join!(
file_retrieval_service.list_files(Some(&folder.id)),
folder_service.list_folders(Some(&folder.id))
);
(
files_r.map_err(|e| AppError::internal_error(format!("Failed to get files: {}", e)))?,
folders_r.map_err(|e| AppError::internal_error(format!("Failed to get subfolders: {}", e)))?,
)
} else {
vec![]
};
let subfolders = if depth != "0" {
folder_service
.list_folders(Some(&folder.id))
.await
.map_err(|e| {
AppError::internal_error(format!("Failed to get subfolders: {}", e))
})?
} else {
vec![]
(vec![], vec![])
};
// Generate response