refactor(ratecontroller): own random generator
This commit is contained in:
1 file changed
+20
-3
+20
-3
@@ -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,
|
||||||
|
|||||||
Reference in new issue
Block a user