From da6dc375d679d302e379214564913aee7ba6f722 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 28 Jun 2026 18:50:24 +0900 Subject: fix(http): avoid nested tokio runtime panic in download path The CurlDownloader owned a tokio runtime and block_on'd reqwest from its sync tick(), while the repository/installer/downloader sync bridges each created another Runtime and block_on'd async fns that reach that leaf. Driving one Runtime::block_on from within another panics with "Cannot start a runtime from within a runtime", hit by `require` when fetching p2 metadata. Switch CurlDownloader to a blocking reqwest client (its own internal thread, never nested) and replace the per-call Runtime::new().block_on bridges with a no-reactor sync_executor::block_on helper. No awaited future parks on a reactor once the only async I/O is blocking, so the helper can be nested freely. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../shirabe/src/installer/installation_manager.rs | 29 ++++++++++------------ 1 file changed, 13 insertions(+), 16 deletions(-) (limited to 'crates/shirabe/src/installer/installation_manager.rs') diff --git a/crates/shirabe/src/installer/installation_manager.rs b/crates/shirabe/src/installer/installation_manager.rs index 3ce8076..a2cc228 100644 --- a/crates/shirabe/src/installer/installation_manager.rs +++ b/crates/shirabe/src/installer/installation_manager.rs @@ -17,6 +17,7 @@ use crate::package::PackageInterfaceHandle; use crate::repository::InstalledRepositoryInterface; use crate::util::Platform; use crate::util::r#loop::Loop; +use crate::util::sync_executor; use anyhow::Result; use indexmap::IndexMap; use shirabe_external_packages::seld::signal::SignalHandler; @@ -231,17 +232,15 @@ impl InstallationManager { } for batch_to_execute in batches { - tokio::runtime::Runtime::new().unwrap().block_on( - self.download_and_execute_batch( - repo, - batch_to_execute, - &mut cleanup_promises, - dev_mode, - run_scripts, - download_only, - all_operations.clone(), - ), - )?; + sync_executor::block_on(self.download_and_execute_batch( + repo, + batch_to_execute, + &mut cleanup_promises, + dev_mode, + run_scripts, + download_only, + all_operations.clone(), + ))?; } Ok(()) @@ -253,9 +252,7 @@ impl InstallationManager { match result { Ok(()) => {} Err(e) => { - tokio::runtime::Runtime::new() - .unwrap() - .block_on(self.run_cleanup(&cleanup_promises)); + sync_executor::block_on(self.run_cleanup(&cleanup_promises)); return Err(e); } } @@ -672,7 +669,7 @@ impl InstallationManager { PhpMixed::Array(http.into_iter().collect()), ); - tokio::runtime::Runtime::new().unwrap().block_on( + sync_executor::block_on( self.loop_ .borrow() .get_http_downloader() @@ -734,7 +731,7 @@ impl InstallationManager { PhpMixed::Array(http.into_iter().collect()), ); - tokio::runtime::Runtime::new().unwrap().block_on( + sync_executor::block_on( self.loop_ .borrow() .get_http_downloader() -- cgit v1.3.1