#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct WorkerRepurposePlan {
pub fetch_workers: usize,
pub persist_workers: usize,
pub fetch_queue_capacity: usize,
pub persist_queue_capacity: usize,
pub dispatch_target: usize,
}
impl WorkerRepurposePlan {
pub fn for_randomized_registry(
fetch_workers: usize,
fetch_queue_capacity: usize,
dispatch_target: usize,
) -> Self {
let fetch_workers = fetch_workers.max(1);
let fetch_queue_capacity = fetch_queue_capacity.max(fetch_workers * 2).max(4);
let dispatch_target = dispatch_target.max(1);
let persist_workers = 1;
let persist_queue_capacity = fetch_queue_capacity.max(dispatch_target).max(4);
Self {
fetch_workers,
persist_workers,
fetch_queue_capacity,
persist_queue_capacity,
dispatch_target,
}
}
}
#[cfg(test)]
mod tests {
use super::WorkerRepurposePlan;
#[test]
fn randomized_registry_plan_keeps_minimum_bounds() {
let plan = WorkerRepurposePlan::for_randomized_registry(0, 0, 0);
assert_eq!(plan.fetch_workers, 1);
assert_eq!(plan.persist_workers, 1);
assert_eq!(plan.fetch_queue_capacity, 4);
assert_eq!(plan.persist_queue_capacity, 4);
assert_eq!(plan.dispatch_target, 1);
}
#[test]
fn randomized_registry_plan_scales_persist_queue_to_dispatch_target() {
let plan = WorkerRepurposePlan::for_randomized_registry(4, 8, 64);
assert_eq!(plan.fetch_workers, 4);
assert_eq!(plan.fetch_queue_capacity, 8);
assert_eq!(plan.persist_workers, 1);
assert_eq!(plan.persist_queue_capacity, 64);
assert_eq!(plan.dispatch_target, 64);
}
}