1use behavior::{
4 Address, Behavior, BehaviorAddr, ChildInputReason, EndpointAddress, EstablishedActor,
5 InterpreterFault, Protocol,
6};
7
8use crate::{
9 ActivationPlan, ChildStopped, InitialWorkerOutcome, ProxyOutcome, ProxyPhase, StableProxy,
10 WorkerAttempt, WorkerCreationRejection, WorkerSubmission,
11};
12
13use crate::atomic::proxy_creation::StableProxyCreationSettlement;
14
15#[derive(Clone, Copy, Debug, Eq, PartialEq)]
17pub enum EntryRetirement {
18 Cancellation,
20 StartFailed,
22 UnexpectedWorkerStopped,
24 Stop,
26 Shutdown,
28}
29
30pub enum EntryStopFailureReason {
32 ControlRejected(ChildInputReason),
34 InterpreterCorrupt(InterpreterFault),
36 InterpretationSkipped,
38}
39
40pub struct EntryStopFailure<A>
46where
47 A: Address,
48{
49 pub(super) reason: EntryStopFailureReason,
50 pub(super) stopped: Option<ChildStopped<A>>,
51}
52
53impl<A> EntryStopFailure<A>
54where
55 A: Address,
56{
57 #[must_use]
59 pub const fn reason(&self) -> &EntryStopFailureReason {
60 &self.reason
61 }
62
63 #[must_use]
65 pub const fn stopped(&self) -> Option<&ChildStopped<A>> {
66 self.stopped.as_ref()
67 }
68
69 #[must_use]
71 pub fn into_parts(self) -> (EntryStopFailureReason, Option<ChildStopped<A>>) {
72 (self.reason, self.stopped)
73 }
74}
75
76#[derive(Clone, Copy, Debug, Eq, PartialEq)]
78pub enum WorkerChange {
79 Start,
81 Replacement,
83}
84
85#[derive(Clone, Copy, Debug, Eq, PartialEq)]
87pub enum WorkerChangeInterruption {
88 ExplicitStop {
90 operation: u64,
92 },
93 SupervisorShutdown { change: WorkerChange },
95}
96
97pub enum CancellationOutcome<Worker, Plan>
99where
100 Worker: Behavior,
101 Plan: ActivationPlan,
102 BehaviorAddr<Worker>: EndpointAddress,
103 StableProxy<Worker, Plan>: Behavior<Protocol = Worker::Protocol>,
104{
105 WorkerReturned,
107 ProxyInputRejected,
109 ProxyReported { outcome: ProxyOutcome<Worker, Plan> },
111}
112
113pub enum InterruptedWorker<Worker, Plan>
115where
116 Worker: Behavior,
117 Plan: ActivationPlan,
118 BehaviorAddr<Worker>: EndpointAddress,
119 StableProxy<Worker, Plan>: Behavior<Protocol = Worker::Protocol>,
120{
121 Submission(WorkerSubmission<Worker, Plan>),
123 ProxyInputRejected,
125 ProxyReported(ProxyOutcome<Worker, Plan>),
127}
128
129pub enum ReplacementFailure<Worker, Plan>
131where
132 Worker: Behavior,
133 Plan: ActivationPlan,
134 BehaviorAddr<Worker>: EndpointAddress,
135 StableProxy<Worker, Plan>: Behavior<Protocol = Worker::Protocol>,
136{
137 ProxyRefused {
139 worker: Worker,
140 activation: Plan,
141 phase: ProxyPhase,
142 },
143 WorkerAttemptsExhausted { worker: Worker, activation: Plan },
145 WorkerCreationRejected {
147 rejection: WorkerCreationRejection<Worker>,
148 activation: Plan,
149 stopped: Option<ChildStopped<BehaviorAddr<Worker>>>,
150 },
151 WorkerUnavailable {
153 drain: crate::ProxyDrain<Worker, Plan>,
154 },
155}
156
157pub enum DynamicLifecycle<Key, Worker, Plan>
159where
160 Worker: Behavior,
161 Plan: ActivationPlan,
162 BehaviorAddr<Worker>: EndpointAddress,
163 StableProxy<Worker, Plan>: Behavior<Protocol = Worker::Protocol>,
164{
165 Started {
166 key: Key,
167 generation: u64,
168 operation: u64,
169 proxy: EstablishedActor<StableProxy<Worker, Plan>>,
170 },
171 StartCreationRejected {
172 key: Key,
173 generation: u64,
174 submission: WorkerSubmission<Worker, Plan>,
175 creation: StableProxyCreationSettlement<Worker, Plan>,
176 },
177 WorkerChangeInterrupted {
178 key: Key,
179 generation: u64,
180 operation: u64,
181 interruption: WorkerChangeInterruption,
182 worker: InterruptedWorker<Worker, Plan>,
183 },
184 StartInputRejected {
185 key: Key,
186 generation: u64,
187 },
188 ReplacementInputRejected {
189 key: Key,
190 generation: u64,
191 operation: u64,
192 },
193 StartOutcomeRejected {
194 key: Key,
195 generation: u64,
196 operation: u64,
197 outcome: InitialWorkerOutcome<Worker, Plan>,
198 },
199 Replaced {
200 key: Key,
201 generation: u64,
202 operation: u64,
203 proxy: EstablishedActor<StableProxy<Worker, Plan>>,
204 },
205 ReplacementFailed {
206 key: Key,
207 generation: u64,
208 operation: u64,
209 failure: ReplacementFailure<Worker, Plan>,
210 },
211 StopFinished {
212 key: Key,
213 generation: u64,
214 operation: u64,
215 proxy: EstablishedActor<StableProxy<Worker, Plan>>,
216 result: Result<ChildStopped<BehaviorAddr<Worker>>, EntryStopFailure<BehaviorAddr<Worker>>>,
217 },
218 UnexpectedWorkerStopped {
219 key: Key,
220 generation: u64,
221 worker: WorkerAttempt,
222 readiness: Plan::Ready,
223 stopped: ChildStopped<BehaviorAddr<Worker>>,
224 disposition: super::UnexpectedExit,
225 },
226 CommandUnavailable {
227 key: Key,
228 generation: u64,
229 sender: BehaviorAddr<Worker>,
230 proxy_phase: ProxyPhase,
231 command: <Worker::Protocol as Protocol>::Msg,
232 },
233 OperationCancelled {
234 key: Key,
235 generation: u64,
236 operation: u64,
237 change: WorkerChange,
238 outcome: CancellationOutcome<Worker, Plan>,
239 },
240 EntryRetired {
241 key: Key,
242 generation: u64,
243 cause: EntryRetirement,
244 },
245}