mod coordinator;
mod protocol;
mod worker;
use super::{MpsLimits, SiteData, TruncationReport};
pub use crate::photonic::runtime::network::WorkerEndpoint;
use crate::{Error, Result};
pub use coordinator::{CoordinatorCheckpoint, DistributedMps, TransferStatistics};
use serde::{Deserialize, Serialize};
use std::time::Duration;
pub use worker::{ShardCheckpoint, ShardWorker, WorkerCheckpoint, serve_state_worker};
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct StateIdentity {
pub program: String,
pub calibration: String,
pub run: String,
}
impl StateIdentity {
fn validate(&self) -> Result<()> {
if [&self.program, &self.calibration, &self.run]
.iter()
.any(|s| s.is_empty() || s.len() > 4096)
{
return Err(Error::InvalidValue(
"invalid distributed state identity".into(),
));
}
Ok(())
}
}
#[derive(Clone, Copy, Debug)]
pub struct StateNetworkLimits {
pub max_frame_bytes: usize,
pub io_timeout: Duration,
pub deadline: Duration,
pub max_workers: usize,
}
impl Default for StateNetworkLimits {
fn default() -> Self {
Self {
max_frame_bytes: 8 << 20,
io_timeout: Duration::from_secs(15),
deadline: Duration::from_secs(300),
max_workers: 128,
}
}
}
impl StateNetworkLimits {
fn validate(&self) -> Result<()> {
if !(256..=64 << 20).contains(&self.max_frame_bytes)
|| self.io_timeout.is_zero()
|| self.deadline.is_zero()
|| self.max_workers == 0
{
return Err(Error::InvalidValue(
"invalid distributed state network limits".into(),
));
}
Ok(())
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub(crate) struct Metadata {
pub start: usize,
pub count: usize,
pub total: usize,
pub epoch: u64,
pub center: usize,
pub report: TruncationReport,
pub shapes: Vec<[usize; 3]>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub(crate) struct Update {
pub previous: u64,
pub next: u64,
pub center: usize,
pub report: TruncationReport,
pub sites: Vec<(usize, SiteData)>,
}
fn err(e: impl std::fmt::Display) -> Error {
Error::InvalidValue(format!("MPS state transport: {e}"))
}