refactor(ratecontroller): own random generator

This commit is contained in:
Nils Andreas Svee committed 2026-08-13 22:16:43 +07:00
1 parent 1a49c9adce
commit 4abf4bfcb8
1 file changed
+20 -3
+20 -3
View File
@@ -31,11 +31,11 @@ enum Direction {
Up, Up,
} }
fn generate_initial_speeds(base_speed: f64, size: u32) -> Vec<f64> { fn generate_initial_speeds(rng: &mut fastrand::Rng, base_speed: f64, size: u32) -> Vec<f64> {
let mut rates = Vec::new(); let mut rates = Vec::new();
for _ in 0..size { for _ in 0..size {
rates.push((fastrand::f64() * 0.2 + 0.75) * base_speed); rates.push((rng.f64() * 0.2 + 0.75) * base_speed);
} }
rates rates
@@ -144,6 +144,7 @@ pub struct Ratecontroller<S: InterfaceStatsProvider, T: TrafficControlBackend> {
reselect_trigger: Sender<bool>, reselect_trigger: Sender<bool>,
state_dl: State<T::Handle>, state_dl: State<T::Handle>,
state_ul: State<T::Handle>, state_ul: State<T::Handle>,
rng: fastrand::Rng,
stats_provider: S, stats_provider: S,
traffic_control: T, traffic_control: T,
metrics: MetricsSender, metrics: MetricsSender,
@@ -158,15 +159,18 @@ impl<S: InterfaceStatsProvider, T: TrafficControlBackend> Ratecontroller<S, T> {
metrics: MetricsSender, metrics: MetricsSender,
mut stats_provider: S, mut stats_provider: S,
mut traffic_control: T, mut traffic_control: T,
mut rng: fastrand::Rng,
) -> anyhow::Result<Self> { ) -> anyhow::Result<Self> {
let dl_shaper = let dl_shaper =
traffic_control.find_shaper(settings.network.download_interface.as_str())?; traffic_control.find_shaper(settings.network.download_interface.as_str())?;
let dl_safe_rates = generate_initial_speeds( let dl_safe_rates = generate_initial_speeds(
&mut rng,
settings.network.download_base_kbits, settings.network.download_base_kbits,
settings.advanced_settings.speed_hist_size, settings.advanced_settings.speed_hist_size,
); );
let ul_shaper = traffic_control.find_shaper(settings.network.upload_interface.as_str())?; let ul_shaper = traffic_control.find_shaper(settings.network.upload_interface.as_str())?;
let ul_safe_rates = generate_initial_speeds( let ul_safe_rates = generate_initial_speeds(
&mut rng,
settings.network.upload_base_kbits, settings.network.upload_base_kbits,
settings.advanced_settings.speed_hist_size, settings.advanced_settings.speed_hist_size,
); );
@@ -182,6 +186,7 @@ impl<S: InterfaceStatsProvider, T: TrafficControlBackend> Ratecontroller<S, T> {
reselect_trigger, reselect_trigger,
state_dl: State::new(dl_shaper, cur_rx, dl_safe_rates), state_dl: State::new(dl_shaper, cur_rx, dl_safe_rates),
state_ul: State::new(ul_shaper, cur_tx, ul_safe_rates), state_ul: State::new(ul_shaper, cur_tx, ul_safe_rates),
rng,
stats_provider, stats_provider,
traffic_control, traffic_control,
metrics, metrics,
@@ -266,7 +271,7 @@ impl<S: InterfaceStatsProvider, T: TrafficControlBackend> Ratecontroller<S, T> {
if state.delta_stat > delay_ms { if state.delta_stat > delay_ms {
match state match state
.safe_rates .safe_rates
.get(fastrand::usize(..state.safe_rates.len())) .get(self.rng.usize(..state.safe_rates.len()))
{ {
Some(rnd_rate) => { Some(rnd_rate) => {
state.next_rate = rnd_rate.min(0.9 * state.current_rate * state.load); state.next_rate = rnd_rate.min(0.9 * state.current_rate * state.load);
@@ -517,6 +522,7 @@ impl Ratecontroller<PlatformInterfaceStats, PlatformTrafficControl> {
metrics, metrics,
interface_stats_provider(), interface_stats_provider(),
traffic_control_backend(), traffic_control_backend(),
fastrand::Rng::new(),
) )
} }
} }
@@ -527,6 +533,17 @@ mod tests {
use crate::baseliner::{EwmaStats, ReflectorState}; use crate::baseliner::{EwmaStats, ReflectorState};
use std::collections::HashMap; use std::collections::HashMap;
#[test]
fn fixed_seed_reproduces_initial_safe_rates() {
let mut first = fastrand::Rng::with_seed(42);
let mut second = fastrand::Rng::with_seed(42);
let first_rates = generate_initial_speeds(&mut first, 100_000.0, 100);
let second_rates = generate_initial_speeds(&mut second, 100_000.0, 100);
assert_eq!(first_rates, second_rates);
}
fn reflector_state( fn reflector_state(
baseline_down: f64, baseline_down: f64,
baseline_up: f64, baseline_up: f64,