xet_runtime/utils/
errors.rs1use thiserror::Error;
2
3#[derive(Debug, Error)]
4#[non_exhaustive]
5pub enum SingleflightError<E>
6where
7 E: Send + std::fmt::Debug + Sync,
8{
9 #[error("BUG: singleflight waiter was notified before result was updated")]
10 NoResult,
11
12 #[error("BUG: call was removed before singleflight owner could update it")]
13 CallMissing,
14
15 #[error("BUG: call didn't create a Notifier for the initial task")]
16 NoNotifierCreated,
17
18 #[error(transparent)]
19 InternalError(#[from] E),
20
21 #[error("Real call failed: {0}")]
22 WaiterInternalError(String),
23
24 #[error("JoinError inside singleflight owner task: {0}")]
25 JoinError(String),
26
27 #[error("Owner task panicked")]
28 OwnerPanicked,
29
30 #[error("Poisoned Group lock")]
31 GroupLockPoisoned,
32}
33
34impl<E: Send + std::fmt::Debug + Sync> Clone for SingleflightError<E> {
35 fn clone(&self) -> Self {
36 match self {
37 SingleflightError::NoResult => SingleflightError::NoResult,
38 SingleflightError::CallMissing => SingleflightError::CallMissing,
39 SingleflightError::NoNotifierCreated => SingleflightError::NoNotifierCreated,
40 SingleflightError::InternalError(e) => SingleflightError::WaiterInternalError(format!("{e:?}")),
41 SingleflightError::WaiterInternalError(s) => SingleflightError::WaiterInternalError(s.clone()),
42 SingleflightError::JoinError(e) => SingleflightError::JoinError(e.clone()),
43 SingleflightError::OwnerPanicked => SingleflightError::OwnerPanicked,
44 SingleflightError::GroupLockPoisoned => SingleflightError::GroupLockPoisoned,
45 }
46 }
47}