node/external_snark_worker/
external_snark_worker_state.rs1use redux::Timestamp;
2use serde::{Deserialize, Serialize};
3
4use crate::snark_pool::JobSummary;
5
6use super::{ExternalSnarkWorkerError, ExternalSnarkWorkerWorkError, SnarkWorkId, SnarkWorkResult};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct ExternalSnarkWorkers(pub(crate) ExternalSnarkWorker);
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct ExternalSnarkWorker {
13 pub(crate) state: ExternalSnarkWorkerState,
14 pub(crate) timestamp: Timestamp,
15}
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub enum ExternalSnarkWorkerState {
19 None,
20 Starting,
21
22 Idle,
23 Working(SnarkWorkId, JobSummary),
24 WorkReady(SnarkWorkId, SnarkWorkResult),
25 WorkError(SnarkWorkId, ExternalSnarkWorkerWorkError),
26
27 Cancelling(SnarkWorkId),
28 Cancelled(SnarkWorkId),
29
30 Killing,
31 Error(ExternalSnarkWorkerError, bool),
32}
33
34impl ExternalSnarkWorkers {
35 pub fn new(now: Timestamp) -> Self {
36 ExternalSnarkWorkers(ExternalSnarkWorker {
37 state: ExternalSnarkWorkerState::None,
38 timestamp: now,
39 })
40 }
41
42 pub fn is_idle(&self) -> bool {
43 matches!(self.0.state, ExternalSnarkWorkerState::Idle)
44 }
45
46 pub fn has_idle(&self) -> bool {
47 self.available() > 0
48 }
49
50 pub fn available(&self) -> usize {
51 if matches!(self.0.state, ExternalSnarkWorkerState::Idle) {
52 1
53 } else {
54 0
55 }
56 }
57
58 pub fn working_job_id(&self) -> Option<&SnarkWorkId> {
59 match &self.0.state {
60 ExternalSnarkWorkerState::Working(job_id, _) => Some(job_id),
61 _ => None,
62 }
63 }
64}