Skip to content

Commit 8db2192

Browse files
committed
fix: block_until_ready can return early when there is still pending work
1 parent b0b6b16 commit 8db2192

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

src/cargo/sources/registry/http_remote.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -796,19 +796,22 @@ impl<'gctx> RegistryData for HttpRegistry<'gctx> {
796796
self.downloads.blocking_calls += 1;
797797

798798
loop {
799-
self.handle_completed_downloads()?;
800-
self.add_sleepers()?;
801-
802799
let remaining_in_multi = tls::set(&self.downloads, || {
803800
self.multi
804801
.perform()
805802
.context("failed to perform http requests")
806803
})?;
807804
trace!(target: "network", "{} transfers remaining", remaining_in_multi);
808-
805+
// Handles transfers performed by `self.multi` above and adds to
806+
// `self.downloads.results`. Failed transfers get added to
807+
// `self.downloads.sleeping` for retry.
808+
self.handle_completed_downloads()?;
809809
if remaining_in_multi + self.downloads.sleeping.len() as u32 == 0 {
810810
return Ok(());
811811
}
812+
// Handles failed transfers in `self.downloads.sleeping` and
813+
// re-adds them to `self.multi`.
814+
self.add_sleepers()?;
812815

813816
if self.downloads.pending.is_empty() {
814817
let delay = self.downloads.sleeping.time_to_next().unwrap();

tests/testsuite/registry.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3349,19 +3349,21 @@ fn sparse_blocking_count() {
33493349

33503350
Package::new("bar", "0.0.1").publish();
33513351

3352+
// Ensure we have the expected number of `block_until_ready` calls.
3353+
// The 1st (0 transfers pending), is the deliberate extra call in `ensure_loaded` for a source.
3354+
// The 2nd (1 transfers pending), is the registry `config.json`.
3355+
// the 3rd (1 transfers pending), is the package metadata for `bar`.
3356+
33523357
p.cargo("check")
33533358
.env("CARGO_LOG", "network::HttpRegistry::block_until_ready=trace")
33543359
.with_stderr_data(str![[r#"
33553360
[..] TRACE network::HttpRegistry::block_until_ready: 0 transfers pending
33563361
[UPDATING] `dummy-registry` index
33573362
[..] TRACE network::HttpRegistry::block_until_ready: 1 transfers pending
33583363
[..] TRACE network::HttpRegistry::block_until_ready: 1 transfers pending
3359-
[..] TRACE network::HttpRegistry::block_until_ready: 1 transfers pending
3360-
[..] TRACE network::HttpRegistry::block_until_ready: 1 transfers pending
33613364
[WARNING] spurious network error (3 tries remaining): failed to get successful HTTP response from `[..]/index/3/b/bar` ([..]), got 500
33623365
body:
33633366
internal server error
3364-
[..] TRACE network::HttpRegistry::block_until_ready: 1 transfers pending
33653367
[LOCKING] 1 package to latest compatible version
33663368
[DOWNLOADING] crates ...
33673369
[DOWNLOADED] bar v0.0.1 (registry `dummy-registry`)

0 commit comments

Comments
 (0)