From 87eca14ba9a2be4f199d4769db0c08f1a7feac78 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 28 Jan 2026 20:39:04 +0000 Subject: [PATCH] Optimize package listing handler with spawn_blocking Wrapped the blocking `list_local_packages` call in `tokio::task::spawn_blocking` to prevent blocking the async runtime thread during recursive directory listing. This improves responsiveness and throughput under load. Co-authored-by: mudcube <101564+mudcube@users.noreply.github.com> --- rust/vm-package-server/src/server.rs | 46 +++++++++++++++++++--------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/rust/vm-package-server/src/server.rs b/rust/vm-package-server/src/server.rs index 2cf53a97..0083f007 100644 --- a/rust/vm-package-server/src/server.rs +++ b/rust/vm-package-server/src/server.rs @@ -236,23 +236,41 @@ async fn health_handler() -> impl IntoResponse { async fn list_packages_handler(State(state): State>) -> impl IntoResponse { // Pass data directory directly to avoid thread-unsafe directory changes - let result = crate::local_storage::list_local_packages(&state.data_dir); + let data_dir = state.data_dir.clone(); + let result = tokio::task::spawn_blocking(move || { + crate::local_storage::list_local_packages(&data_dir) + }) + .await; match result { - Ok(packages) => { - let json = serde_json::to_string(&packages).unwrap_or_else(|_| "{}".to_string()); - let mut headers = HeaderMap::new(); - headers.insert( - header::CONTENT_TYPE, - "application/json" - .parse() - .expect("static header value is valid"), - ); - (StatusCode::OK, headers, json) - } + Ok(inner_result) => match inner_result { + Ok(packages) => { + let json = serde_json::to_string(&packages).unwrap_or_else(|_| "{}".to_string()); + let mut headers = HeaderMap::new(); + headers.insert( + header::CONTENT_TYPE, + "application/json" + .parse() + .expect("static header value is valid"), + ); + (StatusCode::OK, headers, json) + } + Err(e) => { + error!("Failed to list packages: {}", e); + let error_response = format!(r#"{{"error": "{e}"}}"#); + let mut headers = HeaderMap::new(); + headers.insert( + header::CONTENT_TYPE, + "application/json" + .parse() + .expect("static header value is valid"), + ); + (StatusCode::INTERNAL_SERVER_ERROR, headers, error_response) + } + }, Err(e) => { - error!("Failed to list packages: {}", e); - let error_response = format!(r#"{{"error": "{e}"}}"#); + error!("Task join error: {}", e); + let error_response = format!(r#"{{"error": "Internal Server Error"}}"#); let mut headers = HeaderMap::new(); headers.insert( header::CONTENT_TYPE,