dragonfly_client_core/error/
mod.rs1pub mod errors;
18pub mod message;
19
20pub use errors::ErrorType;
21pub use errors::ExternalError;
22
23pub use errors::OrErr;
24pub use errors::{BackendError, DownloadFromParentFailed};
25
26#[derive(thiserror::Error, Debug)]
28pub enum DFError {
29 #[error(transparent)]
31 IO(#[from] std::io::Error),
32
33 #[error(transparent)]
35 VarError(#[from] std::env::VarError),
36
37 #[error("mpsc send: {0}")]
39 MpscSend(String),
40
41 #[error("send timeout")]
43 SendTimeout,
44
45 #[error{"hashring {0} is failed"}]
47 HashRing(String),
48
49 #[error("no space left on device: {0}")]
51 NoSpace(String),
52
53 #[error{"host {0} not found"}]
55 HostNotFound(String),
56
57 #[error{"task {0} not found"}]
59 TaskNotFound(String),
60
61 #[error{"piece {0} not found"}]
63 PieceNotFound(String),
64
65 #[error{"piece {0} state is failed"}]
67 PieceStateIsFailed(String),
68
69 #[error{"download piece {0} finished timeout"}]
71 DownloadPieceFinishedTimeout(String),
72
73 #[error{"wait for piece {0} finished timeout"}]
75 WaitForPieceFinishedTimeout(String),
76
77 #[error{"available manager not found"}]
79 AvailableManagerNotFound,
80
81 #[error{"available schedulers not found"}]
83 AvailableSchedulersNotFound,
84
85 #[error(transparent)]
87 DownloadFromParentFailed(DownloadFromParentFailed),
88
89 #[error{"column family {0} not found"}]
91 ColumnFamilyNotFound(String),
92
93 #[error{"can not transit from {0} to {1}"}]
95 InvalidStateTransition(String, String),
96
97 #[error{"invalid state {0}"}]
99 InvalidState(String),
100
101 #[error("invalid uri {0}")]
103 InvalidURI(String),
104
105 #[error("invalid peer {0}")]
107 InvalidPeer(String),
108
109 #[error{"scheduler client not found"}]
111 SchedulerClientNotFound,
112
113 #[error{"unexpected response"}]
115 UnexpectedResponse,
116
117 #[error{"digest mismatch expected: {0}, actual: {1}"}]
119 DigestMismatch(String, String),
120
121 #[error("content length mismatch expected: {0}, actual: {1}")]
123 ContentLengthMismatch(u64, u64),
124
125 #[error("max schedule count {0} exceeded")]
127 MaxScheduleCountExceeded(u32),
128
129 #[error("invalid content length")]
131 InvalidContentLength,
132
133 #[error("invalid piece length")]
135 InvalidPieceLength,
136
137 #[error("invalid parameter")]
139 InvalidParameter,
140
141 #[error(transparent)]
143 Infallible(#[from] std::convert::Infallible),
144
145 #[error(transparent)]
147 Utf8(#[from] std::str::Utf8Error),
148
149 #[error("unknown {0}")]
151 Unknown(String),
152
153 #[error{"unimplemented"}]
155 Unimplemented,
156
157 #[error{"RangeUnsatisfiable: Failed to parse range fallback error, please file an issue"}]
159 EmptyHTTPRangeError,
160
161 #[error{"unauthorized"}]
163 Unauthorized,
164
165 #[error(transparent)]
167 ArrayTryFromSliceError(#[from] std::array::TryFromSliceError),
168
169 #[error("vortex protocol status: code={0:?}, message={1}")]
171 VortexProtocolStatus(vortex_protocol::tlv::error::Code, String),
172
173 #[error(transparent)]
175 VortexProtocolError(#[from] vortex_protocol::error::Error),
176
177 #[error(transparent)]
179 TonicStatus(#[from] tonic::Status),
180
181 #[error(transparent)]
183 TonicTransportError(#[from] tonic::transport::Error),
184
185 #[error(transparent)]
187 TonicReflectionServerError(#[from] tonic_reflection::server::Error),
188
189 #[error(transparent)]
191 TokioStreamElapsed(#[from] tokio_stream::Elapsed),
192
193 #[error(transparent)]
195 TokioTimeErrorElapsed(#[from] tokio::time::error::Elapsed),
196
197 #[error(transparent)]
199 HeadersError(#[from] headers::Error),
200
201 #[error(transparent)]
203 HTTTHeaderInvalidHeaderName(#[from] http::header::InvalidHeaderName),
204
205 #[error(transparent)]
207 HTTTHeaderInvalidHeaderValue(#[from] http::header::InvalidHeaderValue),
208
209 #[error(transparent)]
211 URLParseError(#[from] url::ParseError),
212
213 #[error(transparent)]
215 ReqwestError(#[from] reqwest::Error),
216
217 #[error(transparent)]
219 ReqwestMiddlewareError(#[from] reqwest_middleware::Error),
220
221 #[error(transparent)]
223 OpenDALError(#[from] opendal::Error),
224
225 #[error(transparent)]
227 HyperError(#[from] hyper::Error),
228
229 #[error(transparent)]
231 BackendError(Box<BackendError>),
232
233 #[error(transparent)]
235 HyperUtilClientLegacyError(#[from] hyper_util::client::legacy::Error),
236
237 #[error(transparent)]
239 ExternalError(#[from] ExternalError),
240
241 #[error("max number of files to download exceeded: {0}")]
243 MaxDownloadFilesExceeded(usize),
244
245 #[error("unsupported {0}")]
247 Unsupported(String),
248
249 #[error(transparent)]
251 TokioJoinError(tokio::task::JoinError),
252
253 #[error("validate failed: {0}")]
255 ValidationError(String),
256}
257
258impl<T> From<tokio::sync::mpsc::error::SendError<T>> for DFError {
260 fn from(e: tokio::sync::mpsc::error::SendError<T>) -> Self {
261 Self::MpscSend(e.to_string())
262 }
263}
264
265impl<T> From<tokio::sync::mpsc::error::SendTimeoutError<T>> for DFError {
267 fn from(err: tokio::sync::mpsc::error::SendTimeoutError<T>) -> Self {
268 match err {
269 tokio::sync::mpsc::error::SendTimeoutError::Timeout(_) => Self::SendTimeout,
270 tokio::sync::mpsc::error::SendTimeoutError::Closed(_) => Self::SendTimeout,
271 }
272 }
273}
274
275#[cfg(test)]
276mod tests {
277 use super::*;
278
279 #[test]
280 fn should_convert_externalerror_to_dferror() {
281 fn function_return_inner_error() -> Result<(), std::io::Error> {
282 let inner_error = std::io::Error::new(std::io::ErrorKind::Other, "inner error");
283 Err(inner_error)
284 }
285
286 fn do_sth_with_error() -> Result<(), DFError> {
287 function_return_inner_error().map_err(|err| {
288 ExternalError::new(crate::error::ErrorType::StorageError).with_cause(err.into())
289 })?;
290 Ok(())
291 }
292
293 let err = do_sth_with_error().err().unwrap();
294 assert_eq!(format!("{}", err), "StorageError cause: inner error");
295 }
296}