Initialize the memory governor from engine byte budgets. Called once at startup. The returned governor is shared (via `Arc`) across the Control Plane and all Data Plane cores. `budgets` carries a byte limit for **every** [`EngineId`]; the governor reports any engine without a budget as being at Emergency pressure, which rejects that engine's writes with `resources exhausted`, so the full map is
(
global_ceiling: usize,
budgets: &EngineByteBudgets,
)
| 21 | /// [`crate::config::EngineConfig::to_byte_budgets`], which derives one |
| 22 | /// entry per `EngineId::ALL` member. |
| 23 | pub fn init_governor( |
| 24 | global_ceiling: usize, |
| 25 | budgets: &EngineByteBudgets, |
| 26 | ) -> crate::Result<Arc<MemoryGovernor>> { |
| 27 | let engine_limits = budgets.as_engine_limits().clone(); |
| 28 | |
| 29 | let config = GovernorConfig { |
| 30 | global_ceiling, |
| 31 | engine_limits, |
| 32 | }; |
| 33 | |
| 34 | let governor = MemoryGovernor::new(config).map_err(|e| crate::Error::Config { |
| 35 | detail: format!("failed to initialize memory governor: {e}"), |
| 36 | })?; |
| 37 | |
| 38 | info!( |
| 39 | global_ceiling, |
| 40 | engines = EngineId::ALL.len(), |
| 41 | total_engine_budget = budgets.total(), |
| 42 | "memory governor initialized" |
| 43 | ); |
| 44 | |
| 45 | Ok(Arc::new(governor)) |
| 46 | } |
| 47 | |
| 48 | #[cfg(test)] |
| 49 | mod tests { |