Skip to main content

xet_runtime/utils/
errors.rs

1use 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}