Skip to main content

apalis_workflow/dag/
error.rs

1use apalis_core::error::BoxDynError;
2use petgraph::{algo::Cycle, graph::NodeIndex};
3use std::fmt::Debug;
4use thiserror::Error;
5
6/// Errors that can occur during DAG workflow execution.
7#[derive(Error, Debug)]
8pub enum DagFlowError {
9    /// An error originating from the actual node execution.
10    #[error("Node execution error: {0}")]
11    NodeExecutionError(#[source] BoxDynError),
12    /// An error originating from the backend.
13    #[error("Backend error: {0}")]
14    Backend(#[source] BoxDynError),
15
16    /// An error originating from the service.
17    #[error("MissingService error: {0:?}")]
18    MissingService(petgraph::graph::NodeIndex),
19
20    /// An error originating from the service.
21    #[error("Service error: {0}")]
22    Service(#[from] DagServiceError),
23
24    /// An error related to codec operations.
25    #[error("Codec error: {0}")]
26    Codec(#[source] BoxDynError),
27
28    /// An error related to metadata operations.
29    #[error("Metadata error: {0}")]
30    Metadata(#[source] BoxDynError),
31
32    /// An error indicating that dependencies are not ready.
33    #[error("Dependencies not ready")]
34    DependenciesNotReady,
35
36    /// An error indicating a missing task ID for a dependency node.
37    #[error("Missing task ID for dependency node {0:?}")]
38    MissingDependencyTaskId(petgraph::graph::NodeIndex),
39
40    /// An error indicating that a task result was not found for a node.
41    #[error("Task result not found for node {0:?}")]
42    TaskResultNotFound(petgraph::graph::NodeIndex),
43
44    /// An error indicating that a dependency task has failed.
45    #[error("Dependency task failed: {0}")]
46    DependencyTaskFailed(String),
47
48    /// An error indicating an unexpected response type during fan-in.
49    #[error("Unexpected response type during fan-in")]
50    UnexpectedResponseType,
51
52    /// An error indicating a mismatch in the number of inputs during fan-in.
53    #[error("Input count mismatch: expected {expected} inputs for fan-in, got {actual}")]
54    InputCountMismatch {
55        /// The expected number of inputs.
56        expected: usize,
57        /// The actual number of inputs received.
58        actual: usize,
59    },
60    /// An error indicating that entry fan-out is not completed.
61    #[error("Entry fan-out not completed")]
62    EntryFanOutIncomplete,
63
64    /// DAG contains cycles.
65    #[error("DAG contains cycles involving nodes: {0:?}")]
66    CyclicDAG(Cycle<NodeIndex>),
67}
68
69/// Error encountered by Service Error
70#[derive(Error, Debug)]
71pub enum DagServiceError {
72    /// DAG service poll error.
73    #[error("DAG encountered a poll error in a service: {0:?}")]
74    PollError(#[source] BoxDynError),
75    /// Missing previous node
76    #[error("Missing previous node")]
77    MissingPreviousNode,
78    /// Missing Fanin Handler
79    #[error("Missing Fanin Handler")]
80    MissingFaninHandler,
81    /// Missing next node
82    #[error("Missing next node")]
83    MissingNextNode,
84    /// Missing TaskId for incoming node
85    #[error("Missing TaskId for incoming node")]
86    MissingIncomingTaskId,
87    /// Missing result for TaskId
88    #[error("Missing result for TaskId {0}")]
89    MissingTaskIdResult(String),
90    /// Dependency task returned invalid response, which is unexpected during fan-in
91    #[error("Fan-in dependency task returned invalid response")]
92    InvalidFanInDependencyResult,
93
94    /// Dependency task failed
95    #[error("Dependency task failed: {0:?}")]
96    DependencyTaskFailed(#[source] BoxDynError),
97}