From 83e346d2672d1e22cb75f7e31387450011b1af0a Mon Sep 17 00:00:00 2001 From: Cylae <13425054+Cylae@users.noreply.github.com> Date: Sun, 13 Sep 2026 23:32:12 +0000 Subject: [PATCH] Refactor spawn_blocking error propagation - Removed redundant `.context("Failed to join blocking task")` wrappers in `load_async` and `update_service_async` within `config.rs` and `users.rs`, favoring idiomatic `.await?` for exact `JoinError` propagation. - Replaced silent `.unwrap_or(false)` and `.unwrap_or(tuple)` with `.unwrap_or_else` in `users.rs` password verification and `web.rs` telemetry to explicitly log `JoinError`s. - Refactored six axum handlers in `web.rs` (`add_user`, `update_user_role_and_quota`, `delete_user`, `install_user_app`, `uninstall_user_app`, `update_password`) to replace verbose error swallowing `match` blocks with `.unwrap_or_else` capturing the `JoinError` contextually into the `anyhow` chain, preventing silent loss of source failures. - Zero behavior changes outside error preservation. --- server_manager/src/core/config.rs | 8 +-- server_manager/src/core/users.rs | 9 +-- server_manager/src/interface/web.rs | 89 +++++++++-------------------- 3 files changed, 35 insertions(+), 71 deletions(-) diff --git a/server_manager/src/core/config.rs b/server_manager/src/core/config.rs index 49a831b..60a26a3 100644 --- a/server_manager/src/core/config.rs +++ b/server_manager/src/core/config.rs @@ -45,9 +45,7 @@ impl Config { Self::load_from(&Self::get_config_path()) } pub async fn load_async() -> Result { - tokio::task::spawn_blocking(Self::load) - .await - .context("Failed to join blocking task")? + tokio::task::spawn_blocking(Self::load).await? } pub fn save_to(&self, path: &Path) -> Result<()> { @@ -93,9 +91,7 @@ impl Config { { let path = Self::get_config_path(); let name = name.to_owned(); - tokio::task::spawn_blocking(move || Self::update_service_at(&path, &name, update)) - .await - .context("Failed to join blocking task")? + tokio::task::spawn_blocking(move || Self::update_service_at(&path, &name, update)).await? } pub async fn enable_service_async(name: &str) -> Result<()> { Self::update_service_async(name, |cfg, name| cfg.disabled_services.remove(name)).await diff --git a/server_manager/src/core/users.rs b/server_manager/src/core/users.rs index f008f56..e617b3b 100644 --- a/server_manager/src/core/users.rs +++ b/server_manager/src/core/users.rs @@ -98,9 +98,7 @@ pub struct UserManager { impl UserManager { pub async fn load_async() -> Result { - tokio::task::spawn_blocking(Self::load) - .await - .context("Failed to join blocking task")? + tokio::task::spawn_blocking(Self::load).await? } pub fn load() -> Result { @@ -399,7 +397,10 @@ impl UserManager { let is_valid = tokio::task::spawn_blocking(move || verify_password(&password, &hash)) .await - .unwrap_or(false); + .unwrap_or_else(|e| { + log::error!("Task join error during password verification: {}", e); + false + }); if is_valid { return Some(user_clone); diff --git a/server_manager/src/interface/web.rs b/server_manager/src/interface/web.rs index cb42ef6..8c8cfa6 100644 --- a/server_manager/src/interface/web.rs +++ b/server_manager/src/interface/web.rs @@ -311,7 +311,10 @@ pub async fn start_server(bind: &str, port: u16) -> anyhow::Result<()> { ) }) .await - .unwrap_or((0, 0, 0, 0, 0.0, 0, 0)); + .unwrap_or_else(|e| { + error!("Telemetry task join error: {}", e); + (0, 0, 0, 0, 0.0, 0, 0) + }); let update_info = crate::core::updater::check_for_updates().unwrap_or( crate::core::updater::UpdateInfo { @@ -1157,20 +1160,14 @@ async fn add_user_handler( let user_name = payload.username.clone(); let pass = payload.password.clone(); - let res = match tokio::task::spawn_blocking(move || -> anyhow::Result { + let res = tokio::task::spawn_blocking(move || -> anyhow::Result { manager_clone.add_user(&user_name, &pass, role_enum, quota_val)?; Ok(manager_clone) }) .await - { - Ok(r) => r, - Err(e) => { - error!("Blocking task join error in add_user: {}", e); - Err(anyhow::anyhow!( - "Internal server error: failed to join background task" - )) - } - }; + .unwrap_or_else(|e| { + Err(anyhow::Error::from(e).context("Blocking task join error in add_user")) + }); match res { Ok(new_manager) => { @@ -1237,20 +1234,14 @@ async fn update_user_handler( let mut manager_clone = cache.manager.clone(); let u_name = username.clone(); - let res = match tokio::task::spawn_blocking(move || -> anyhow::Result { + let res = tokio::task::spawn_blocking(move || -> anyhow::Result { manager_clone.update_user_role_and_quota(&u_name, role_enum, quota_val)?; Ok(manager_clone) }) .await - { - Ok(r) => r, - Err(e) => { - error!("Blocking task join error in update_user: {}", e); - Err(anyhow::anyhow!( - "Internal server error: failed to join background task" - )) - } - }; + .unwrap_or_else(|e| { + Err(anyhow::Error::from(e).context("Blocking task join error in update_user")) + }); match res { Ok(new_manager) => { @@ -1297,20 +1288,14 @@ async fn delete_user_handler( let mut manager_clone = cache.manager.clone(); let u_name = username.clone(); - let res = match tokio::task::spawn_blocking(move || -> anyhow::Result { + let res = tokio::task::spawn_blocking(move || -> anyhow::Result { manager_clone.delete_user(&u_name)?; Ok(manager_clone) }) .await - { - Ok(r) => r, - Err(e) => { - error!("Blocking task join error in delete_user: {}", e); - Err(anyhow::anyhow!( - "Internal server error: failed to join background task" - )) - } - }; + .unwrap_or_else(|e| { + Err(anyhow::Error::from(e).context("Blocking task join error in delete_user")) + }); match res { Ok(new_manager) => { @@ -1598,20 +1583,14 @@ async fn user_install_app_handler( let u_name = user.username.clone(); let app_name = name.clone(); - let res = match tokio::task::spawn_blocking(move || -> anyhow::Result { + let res = tokio::task::spawn_blocking(move || -> anyhow::Result { manager_clone.install_user_app(&u_name, &app_name)?; Ok(manager_clone) }) .await - { - Ok(r) => r, - Err(e) => { - error!("Blocking task join error in install_user_app: {}", e); - Err(anyhow::anyhow!( - "Internal server error: failed to join background task" - )) - } - }; + .unwrap_or_else(|e| { + Err(anyhow::Error::from(e).context("Blocking task join error in install_user_app")) + }); if let Ok(new_manager) = res { cache.manager = new_manager; @@ -1649,20 +1628,14 @@ async fn user_uninstall_app_handler( let u_name = user.username.clone(); let app_name = name.clone(); - let res = match tokio::task::spawn_blocking(move || -> anyhow::Result { + let res = tokio::task::spawn_blocking(move || -> anyhow::Result { manager_clone.uninstall_user_app(&u_name, &app_name)?; Ok(manager_clone) }) .await - { - Ok(r) => r, - Err(e) => { - error!("Blocking task join error in uninstall_user_app: {}", e); - Err(anyhow::anyhow!( - "Internal server error: failed to join background task" - )) - } - }; + .unwrap_or_else(|e| { + Err(anyhow::Error::from(e).context("Blocking task join error in uninstall_user_app")) + }); if let Ok(new_manager) = res { cache.manager = new_manager; @@ -1801,20 +1774,14 @@ async fn user_passwd_handler( let u_name = user.username.clone(); let new_pass = payload.password.clone(); - let res = match tokio::task::spawn_blocking(move || -> anyhow::Result { + let res = tokio::task::spawn_blocking(move || -> anyhow::Result { manager_clone.update_password(&u_name, &new_pass)?; Ok(manager_clone) }) .await - { - Ok(r) => r, - Err(e) => { - error!("Blocking task join error in update_password: {}", e); - Err(anyhow::anyhow!( - "Internal server error: failed to join background task" - )) - } - }; + .unwrap_or_else(|e| { + Err(anyhow::Error::from(e).context("Blocking task join error in update_password")) + }); if let Ok(new_manager) = res { cache.manager = new_manager;