aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/installer/installation_manager.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-28 18:50:24 +0900
committernsfisis <nsfisis@gmail.com>2026-06-28 18:50:24 +0900
commitda6dc375d679d302e379214564913aee7ba6f722 (patch)
treeda57c376d065c239507d0d542f1f0bb3194977af /crates/shirabe/src/installer/installation_manager.rs
parent1b2473fd155b88c8aa90aaa844d183af617b6e8a (diff)
downloadphp-shirabe-da6dc375d679d302e379214564913aee7ba6f722.tar.gz
php-shirabe-da6dc375d679d302e379214564913aee7ba6f722.tar.zst
php-shirabe-da6dc375d679d302e379214564913aee7ba6f722.zip
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) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/installer/installation_manager.rs')
-rw-r--r--crates/shirabe/src/installer/installation_manager.rs29
1 files changed, 13 insertions, 16 deletions
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()