pub use grommet_topology::{
Advice, Bound, Observation, OffloadPool, Plan, Quota, ShardPlacement, Verdict, Workload, bind,
calibrate, cgroup, detect,
};
#[cfg(feature = "topology")]
pub use grommet_topology::{plan, plan_shared};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum PinPolicy {
#[cfg(feature = "topology")]
Require,
#[default]
BestEffort,
Disabled,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct TopologyReport {
pub shards: usize,
pub distinct_cores: usize,
pub pinned: usize,
pub memory_bound: usize,
pub policy: PinPolicy,
}
impl TopologyReport {
pub fn oversubscribed(&self) -> bool {
self.shards > self.distinct_cores
}
pub fn memory_unbound(&self) -> usize {
self.pinned.saturating_sub(self.memory_bound)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_report_names_oversubscription() {
let report = TopologyReport {
shards: 64,
distinct_cores: 9,
pinned: 64,
memory_bound: 64,
policy: PinPolicy::BestEffort,
};
assert!(report.oversubscribed());
assert!(!TopologyReport { shards: 4, distinct_cores: 4, ..report }.oversubscribed());
}
#[test]
fn a_report_names_shards_that_got_a_core_but_not_a_memory_node() {
let report = TopologyReport {
shards: 8,
distinct_cores: 8,
pinned: 8,
memory_bound: 3,
policy: PinPolicy::BestEffort,
};
assert_eq!(report.memory_unbound(), 5);
assert_eq!(TopologyReport { pinned: 0, memory_bound: 8, ..report }.memory_unbound(), 0);
}
#[test]
fn planning_this_machine_produces_something_a_runtime_can_use() {
let layout = detect(&Workload::default()).expect("read this machine");
assert!(!layout.shards.is_empty(), "every machine has at least one core to dispatch from");
for shard in &layout.shards {
assert!(layout.pool_for(shard.node).is_some() || layout.offload.is_empty());
}
}
}