diff --git a/relay-server/src/services/objectstore.rs b/relay-server/src/services/objectstore.rs index 1ea28e6afeb..7b70904d230 100644 --- a/relay-server/src/services/objectstore.rs +++ b/relay-server/src/services/objectstore.rs @@ -29,7 +29,7 @@ use crate::services::outcome::DiscardReason; use crate::services::store::{Store, StoreAttachment, StoreEnvelope, StoreTraceItem}; use crate::services::upload::ByteStream; use crate::statsd::{RelayCounters, RelayTimers}; -use crate::utils::{BoundedStream, MeteredStream, RetryableStream, TakeOnce}; +use crate::utils::{BoundedStream, MeteredStream, RetryableStream, TakeOnce, find_error_source}; use super::outcome::Outcome; @@ -175,6 +175,9 @@ impl Error { type = kind.as_str(), attempts = self.attempts.to_string(), ); + if self.kind.is_client_error() { + return; + } relay_log::error!( error = &self.kind as &dyn std::error::Error, amount = self.amount, @@ -222,6 +225,15 @@ impl ErrorKind { Self::Uuid(_) => "uuid", } } + + fn is_client_error(&self) -> bool { + match self { + ErrorKind::UploadFailed(objectstore_client::Error::Reqwest(error)) => { + find_error_source(error, is_user_error).is_some() + } + _ => false, + } + } } impl OutcomeError for Error { @@ -742,6 +754,15 @@ fn is_retryable(error: &objectstore_client::Error) -> bool { } } +fn is_user_error(error: &(dyn std::error::Error + 'static)) -> bool { + error.downcast_ref::().is_some_and(|error| { + matches!( + error.kind(), + std::io::ErrorKind::FileTooLarge | std::io::ErrorKind::UnexpectedEof + ) + }) +} + #[cfg(test)] mod tests { use relay_system::Service;