use crate::{
common::task::ValorMasterTask, master::ValorWorkerRegistry, service::ValorServiceId,
types::ValorID,
};
pub struct ValorMasterScheduler;
impl ValorMasterScheduler {
pub fn select_worker(task: &ValorMasterTask, reg: &ValorWorkerRegistry) -> Option<ValorID> {
let required: Option<ValorServiceId> = match &task.task_type {
crate::common::task::ValorTaskType::ExecuteService { service_id, .. } => {
Some(service_id.clone())
}
};
if let Some(req) = required {
let mut best: Option<(ValorID, u32)> = None;
for (id, rec) in reg.iter() {
if rec.state == crate::master::ValorWorkerState::Ready
&& rec.services.iter().any(|s| s == &req)
{
let score = rec.capacity.free_cpu;
if best.as_ref().map(|b| score > b.1).unwrap_or(true) {
best = Some((id.clone(), score));
}
}
}
if let Some((id, _)) = best {
return Some(id);
}
}
let mut best: Option<(ValorID, u32)> = None;
for (id, rec) in reg.iter() {
if rec.state == crate::master::ValorWorkerState::Ready {
let score = rec.capacity.free_cpu;
if best.as_ref().map(|b| score > b.1).unwrap_or(true) {
best = Some((id.clone(), score));
}
}
}
best.map(|(id, _)| id)
}
}