From 6d6ed1760c274fa0312b02ae99a82fef26f642e4 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 9 Dec 2024 17:04:25 -0500 Subject: [PATCH] Retry on tar extraction errors --- crates/uv-client/src/base_client.rs | 53 +++++------------------------ 1 file changed, 9 insertions(+), 44 deletions(-) diff --git a/crates/uv-client/src/base_client.rs b/crates/uv-client/src/base_client.rs index d9acc8964163..bf26034e970c 100644 --- a/crates/uv-client/src/base_client.rs +++ b/crates/uv-client/src/base_client.rs @@ -25,7 +25,7 @@ use uv_warnings::warn_user_once; use crate::linehaul::LineHaul; use crate::middleware::OfflineMiddleware; use crate::tls::read_identity; -use crate::{Connectivity, WrappedReqwestError}; +use crate::Connectivity; pub const DEFAULT_RETRIES: u32 = 3; @@ -458,51 +458,16 @@ impl RetryableStrategy for UvRetryableStrategy { pub fn is_extended_transient_error(err: &dyn Error) -> bool { trace!("Attempting to retry error: {err:?}"); - if let Some(err) = find_source::(&err) { - // First, look for `WrappedReqwestError`, which wraps `reqwest::Error` but doesn't always - // include it in the source. - if let Some(io) = find_source::(&err) { - if io.kind() == std::io::ErrorKind::ConnectionReset - || io.kind() == std::io::ErrorKind::UnexpectedEof - { - trace!( - "Retrying error: `ConnectionReset` or `UnexpectedEof` (`WrappedReqwestError`)" - ); - return true; - } - trace!("Cannot retry error: not one of `ConnectionReset` or `UnexpectedEof` (`WrappedReqwestError`)"); - } else { - trace!("Cannot retry error: not an IO error (`WrappedReqwestError`)"); - } - } else if let Some(err) = find_source::(&err) { - // Next, look for `reqwest_middleware::Error`, which wraps `reqwest::Error`, but also - // includes errors from the middleware stack. - if let Some(io) = find_source::(&err) { - if io.kind() == std::io::ErrorKind::ConnectionReset - || io.kind() == std::io::ErrorKind::UnexpectedEof - { - trace!("Retrying error: `ConnectionReset` or `UnexpectedEof` (`reqwest_middleware::Error`)"); - return true; - } - trace!("Cannot retry error: not one of `ConnectionReset` or `UnexpectedEof` (`reqwest_middleware::Error`)"); - } else { - trace!("Cannot retry error: not an IO error (`reqwest_middleware::Error`)"); - } - } else if let Some(err) = find_source::(&err) { - // Finally, look for `reqwest::Error`, which is the most common error type. - if let Some(io) = find_source::(&err) { - if io.kind() == std::io::ErrorKind::ConnectionReset - || io.kind() == std::io::ErrorKind::UnexpectedEof - { - trace!("Retrying error: `ConnectionReset` or `UnexpectedEof` (`reqwest::Error`)"); - return true; - } - trace!("Cannot retry error: not one of `ConnectionReset` or `UnexpectedEof` (`reqwest::Error`)"); - } else { - trace!("Cannot retry error: not an IO error (`reqwest::Error`)"); + if let Some(io) = find_source::(&err) { + if io.kind() == std::io::ErrorKind::ConnectionReset + || io.kind() == std::io::ErrorKind::UnexpectedEof + { + trace!("Retrying error: `ConnectionReset` or `UnexpectedEof`"); + return true; } + trace!("Cannot retry error: not one of `ConnectionReset` or `UnexpectedEof`"); } else { - trace!("Cannot retry error: not a reqwest error"); + trace!("Cannot retry error: not an IO error"); } false