From e2d105d045a18528cfe1f89a319a62b21fe2dae5 Mon Sep 17 00:00:00 2001 From: konsti Date: Sun, 4 May 2025 14:56:15 +0200 Subject: [PATCH] Retry streaming downloads on broken pipe errors (#13281) Educated guess at #12359 See https://github.com/hyperium/h2/blob/adab70fd9f9e5ce3099d274a4b548a27bfdee4dc/src/proto/streams/state.rs#L309-L310 for the error source. --- crates/uv-client/src/base_client.rs | 1 + crates/uv-client/src/cached_client.rs | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/uv-client/src/base_client.rs b/crates/uv-client/src/base_client.rs index 17ea61302..371575819 100644 --- a/crates/uv-client/src/base_client.rs +++ b/crates/uv-client/src/base_client.rs @@ -497,6 +497,7 @@ pub fn is_extended_transient_error(err: &dyn Error) -> bool { for io_err in find_sources::(&err) { if io_err.kind() == io::ErrorKind::ConnectionReset || io_err.kind() == io::ErrorKind::UnexpectedEof + || io_err.kind() == io::ErrorKind::BrokenPipe { trace!("Retrying error: `ConnectionReset` or `UnexpectedEof`"); return true; diff --git a/crates/uv-client/src/cached_client.rs b/crates/uv-client/src/cached_client.rs index 3ee9e1cfc..e23b39415 100644 --- a/crates/uv-client/src/cached_client.rs +++ b/crates/uv-client/src/cached_client.rs @@ -623,8 +623,7 @@ impl CachedClient { .await; if result .as_ref() - .err() - .is_some_and(|err| is_extended_transient_error(err)) + .is_err_and(|err| is_extended_transient_error(err)) { let retry_decision = retry_policy.should_retry(start_time, n_past_retries); if let reqwest_retry::RetryDecision::Retry { execute_after } = retry_decision {