Skip to main content

runmat_execution/resource/
mod.rs

1use std::collections::BTreeSet;
2
3use serde::{Deserialize, Serialize};
4
5use crate::ContractError;
6
7#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case")]
9pub enum Capability {
10    ProcessIsolation,
11    BrowserWorker,
12    NetworkDenied,
13    Accelerator(String),
14    Custom(String),
15}
16
17#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
18pub struct AcceleratorRequest {
19    pub class: String,
20    pub count: u16,
21    pub memory_bytes_each: u64,
22}
23
24#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
25pub struct ResourceRequest {
26    pub cpu_millicores: u32,
27    pub memory_bytes: u64,
28    pub scratch_bytes: u64,
29    pub max_wall_millis: u64,
30    pub max_artifact_bytes: u64,
31    pub max_egress_bytes: u64,
32    pub max_relay_bytes: u64,
33    pub accelerators: Vec<AcceleratorRequest>,
34    pub required_capabilities: BTreeSet<Capability>,
35}
36
37impl ResourceRequest {
38    pub fn validate(&self) -> Result<(), ContractError> {
39        if self.cpu_millicores == 0 {
40            return Err(ContractError::invalid(
41                "cpu_millicores",
42                "must be greater than zero",
43            ));
44        }
45        if self.memory_bytes == 0 || self.max_wall_millis == 0 {
46            return Err(ContractError::invalid(
47                "resource request",
48                "memory and maximum duration must be greater than zero",
49            ));
50        }
51        if self.accelerators.len() > 16 {
52            return Err(ContractError::Limit {
53                field: "accelerators",
54                limit: 16,
55            });
56        }
57        for accelerator in &self.accelerators {
58            if accelerator.class.is_empty()
59                || accelerator.class.len() > 96
60                || accelerator.count == 0
61            {
62                return Err(ContractError::invalid(
63                    "accelerator request",
64                    "class must be 1..=96 bytes and count must be non-zero",
65                ));
66            }
67        }
68        Ok(())
69    }
70}
71
72#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
73pub struct ResourceInventory {
74    pub cpu_millicores: u32,
75    pub memory_bytes: u64,
76    pub scratch_bytes: u64,
77    pub accelerators: Vec<AcceleratorRequest>,
78    pub capabilities: BTreeSet<Capability>,
79}
80
81#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
82pub struct ResourceUsage {
83    pub cpu_core_millis: u64,
84    pub memory_byte_millis: u128,
85    pub accelerator_millis: Vec<AcceleratorUsage>,
86    pub wall_millis: u64,
87    pub retained_byte_millis: u128,
88    pub egress_bytes: u64,
89    pub relay_bytes: u64,
90}
91
92#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
93pub struct AcceleratorUsage {
94    pub class: String,
95    pub device_millis: u64,
96}