node/external_snark_worker/
external_snark_worker_state.rs

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