From ca1211d92784f74a9a2a4b8e142122c46978be50 Mon Sep 17 00:00:00 2001 From: Gwen Lg Date: Tue, 3 Feb 2026 23:13:23 +0100 Subject: [PATCH 1/3] refactor: manualy build tokio runtime for garage to allow do some initialization before --- src/garage/main.rs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/garage/main.rs b/src/garage/main.rs index 403ba55c..f55d0324 100644 --- a/src/garage/main.rs +++ b/src/garage/main.rs @@ -63,8 +63,7 @@ struct Opt { cmd: Command, } -#[tokio::main] -async fn main() { +fn main() { // Initialize version and features info let features = &[ #[cfg(feature = "bundled-libs")] @@ -145,7 +144,20 @@ async fn main() { sodiumoxide::init().expect("Unable to init sodiumoxide"); - let res = match opt.cmd { + let res = tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .expect("build tokio multi_thread runtime failed") + .block_on(run(opt)); + + if let Err(e) = res { + eprintln!("Error: {}", e); + std::process::exit(1); + } +} + +async fn run(opt: Opt) -> Result<(), Error> { + match opt.cmd { Command::Server => server::run_server(opt.config_file, opt.secrets).await, Command::OfflineRepair(repair_opt) => { cli::local::repair::offline_repair(opt.config_file, opt.secrets, repair_opt).await @@ -166,11 +178,6 @@ async fn main() { Ok(()) } _ => cli_command(opt).await, - }; - - if let Err(e) = res { - eprintln!("Error: {}", e); - std::process::exit(1); } } From 5c8a31708e2156be009d2dddc7f706948dfa6ddc Mon Sep 17 00:00:00 2001 From: Gwen Lg Date: Tue, 3 Feb 2026 23:22:11 +0100 Subject: [PATCH 2/3] refactor: manualy build tokio runtime for k2v-cli --- src/k2v-client/bin/k2v-cli.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/k2v-client/bin/k2v-cli.rs b/src/k2v-client/bin/k2v-cli.rs index b1c2169b..06850319 100644 --- a/src/k2v-client/bin/k2v-cli.rs +++ b/src/k2v-client/bin/k2v-cli.rs @@ -388,8 +388,7 @@ impl Filter { } } -#[tokio::main] -async fn main() -> Result<(), Error> { +fn main() -> Result<(), Error> { if std::env::var("RUST_LOG").is_err() { std::env::set_var("RUST_LOG", "warn") } @@ -412,6 +411,14 @@ async fn main() -> Result<(), Error> { let client = K2vClient::new(config)?; + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + .block_on(run(args)) +} + +async fn run(args: Args) -> Result<(), Error> { match args.command { Command::Insert { partition_key, @@ -603,6 +610,5 @@ async fn main() -> Result<(), Error> { } } } - Ok(()) } From 473b66ca5bd17d2db733fc711fb4b1917564f55c Mon Sep 17 00:00:00 2001 From: Gwen Lg Date: Tue, 27 Jan 2026 15:32:12 +0100 Subject: [PATCH 3/3] fix: mark unsafety of std::env::set_var and document the function. --- src/garage/main.rs | 7 ++++++- src/k2v-client/bin/k2v-cli.rs | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/garage/main.rs b/src/garage/main.rs index f55d0324..6a8c9412 100644 --- a/src/garage/main.rs +++ b/src/garage/main.rs @@ -181,13 +181,18 @@ async fn run(opt: Opt) -> Result<(), Error> { } } +/// # Safety +/// +/// should be called before tokio runtime initialization +/// to limit multithread problem with `std::env::set_var` which is unsafe fn init_logging(opt: &Opt) { if std::env::var("RUST_LOG").is_err() { let default_log = match &opt.cmd { Command::Server => "netapp=info,garage=info", _ => "netapp=warn,garage=warn", }; - std::env::set_var("RUST_LOG", default_log) + + unsafe { std::env::set_var("RUST_LOG", default_log) }; } let env_filter = tracing_subscriber::filter::EnvFilter::from_default_env(); diff --git a/src/k2v-client/bin/k2v-cli.rs b/src/k2v-client/bin/k2v-cli.rs index 06850319..d361c6dc 100644 --- a/src/k2v-client/bin/k2v-cli.rs +++ b/src/k2v-client/bin/k2v-cli.rs @@ -388,9 +388,12 @@ impl Filter { } } +/// # Safety +/// +/// initialize `RUST_LOG` env var before start tokio runtime to limit multithread problem with `std::env::set_var` which is unsafe fn main() -> Result<(), Error> { if std::env::var("RUST_LOG").is_err() { - std::env::set_var("RUST_LOG", "warn") + unsafe { std::env::set_var("RUST_LOG", "warn") }; } tracing_subscriber::fmt()