use std::time::Duration;
use super::resources::ByteSize;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QosLevel {
BestEffort,
Background,
Interactive,
Realtime,
}
#[derive(Debug, Clone, PartialEq)]
pub struct RetryPolicy {
pub max_retries: usize,
pub initial_backoff: Duration,
pub backoff_multiplier: f64,
}
impl Default for RetryPolicy {
fn default() -> Self {
Self {
max_retries: 3,
initial_backoff: Duration::from_millis(100),
backoff_multiplier: 2.0,
}
}
}
#[derive(Debug, Clone, PartialEq, Default)]
pub struct ResourceLimits {
pub max_memory: Option<ByteSize>,
pub max_cores: Option<usize>,
pub max_gpu_memory: Option<ByteSize>,
}
#[derive(Debug, Clone, PartialEq, Default)]
pub struct ObservabilityConfig {
pub tracing: bool,
pub metrics: bool,
pub sampling_rate: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ExecutionPolicy {
pub qos: QosLevel,
pub preemptible: bool,
pub timeout: Option<Duration>,
pub retry: RetryPolicy,
pub limits: ResourceLimits,
pub observability: ObservabilityConfig,
}
impl Default for ExecutionPolicy {
fn default() -> Self {
Self {
qos: QosLevel::Interactive,
preemptible: true,
timeout: None,
retry: RetryPolicy::default(),
limits: ResourceLimits::default(),
observability: ObservabilityConfig::default(),
}
}
}
impl ExecutionPolicy {
pub fn realtime() -> Self {
Self {
qos: QosLevel::Realtime,
preemptible: false,
timeout: Some(Duration::from_millis(100)),
..Default::default()
}
}
pub fn batch() -> Self {
Self {
qos: QosLevel::BestEffort,
preemptible: true,
timeout: None,
..Default::default()
}
}
pub fn interactive() -> Self {
Self::default()
}
pub fn debug() -> Self {
Self {
qos: QosLevel::BestEffort,
preemptible: true,
timeout: None,
observability: ObservabilityConfig {
tracing: true,
metrics: true,
sampling_rate: 1.0,
},
..Default::default()
}
}
}