runmat_execution/resource/
mod.rs1use 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}