From fa13af1686fa335c6ee108adb05373bf5ca0b3a1 Mon Sep 17 00:00:00 2001 From: Cylae <13425054+Cylae@users.noreply.github.com> Date: Sat, 14 Feb 2026 13:38:51 +0000 Subject: [PATCH] perf: optimize server initialization to be non-blocking - Offload `sysinfo::System` initialization to `tokio::task::spawn_blocking` - Use `Config::load_async()` and `UserManager::load_async()` - Use `tokio::fs::metadata` for file modification checks - Ensure consistent priority logic for `users.yaml` (CWD then /opt) This prevents stalling the async executor during startup, adhering to best practices and improving overall runtime responsiveness. --- server_manager/src/core/secrets.rs | 2 +- server_manager/src/interface/web.rs | 36 ++++++++++++++++++----------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/server_manager/src/core/secrets.rs b/server_manager/src/core/secrets.rs index 5908693..cb4c15b 100644 --- a/server_manager/src/core/secrets.rs +++ b/server_manager/src/core/secrets.rs @@ -1,7 +1,7 @@ use anyhow::{Context, Result}; use log::info; -use serde::{Deserialize, Serialize}; use rand::RngExt; +use serde::{Deserialize, Serialize}; use std::fs; use std::path::Path; diff --git a/server_manager/src/interface/web.rs b/server_manager/src/interface/web.rs index 1f677c3..e055595 100644 --- a/server_manager/src/interface/web.rs +++ b/server_manager/src/interface/web.rs @@ -130,24 +130,32 @@ pub async fn start_server(port: u16) -> anyhow::Result<()> { .with_secure(false) // Localhost/LAN, http usually .with_expiry(Expiry::OnInactivity(Duration::hours(24))); - // Initialize System once - let mut sys = System::new_all(); - sys.refresh_all(); - - let initial_config = Config::load().unwrap_or_default(); - let initial_config_mtime = std::fs::metadata("config.yaml") + // Initialize System once (non-blocking) + let sys = tokio::task::spawn_blocking(|| { + let mut s = System::new_all(); + s.refresh_all(); + s + }) + .await?; + + let initial_config = Config::load_async().await.unwrap_or_default(); + let initial_config_mtime = tokio::fs::metadata("config.yaml") + .await .ok() .and_then(|m| m.modified().ok()); - let initial_users = UserManager::load().unwrap_or_default(); - let initial_users_mtime = std::fs::metadata("users.yaml") + let initial_users = UserManager::load_async().await.unwrap_or_default(); + let mut initial_users_mtime = tokio::fs::metadata("users.yaml") + .await .ok() - .and_then(|m| m.modified().ok()) - .or_else(|| { - std::fs::metadata("/opt/server_manager/users.yaml") - .ok() - .and_then(|m| m.modified().ok()) - }); + .and_then(|m| m.modified().ok()); + + if initial_users_mtime.is_none() { + initial_users_mtime = tokio::fs::metadata("/opt/server_manager/users.yaml") + .await + .ok() + .and_then(|m| m.modified().ok()); + } let app_state = Arc::new(AppState { system: Mutex::new(sys),