refactor(baseliner): Replace shared Mutex state with thread-safe control snapshots

Eliminate lock contention between the baseliner, ratecontroller, and selector by moving to a message-passing architecture using immutable snapshots of reflector state. This improves data consistency and simplifies cross-thread communication.
This commit is contained in:
Nils Andreas Svee committed 2026-07-24 00:05:41 +07:00
1 parent 51377f947f
commit c1bcb22b23
5 files changed
+703 -250

No files matched your search

+13 -9
View File
@@ -20,7 +20,7 @@ mod reflector_selector;
mod time;
mod util;
use crate::baseliner::{Baseliner, ReflectorStats};
use crate::baseliner::Baseliner;
use crate::metrics::{Metric, Metrics, MetricsSender};
use ::log::{debug, info, warn};
use flume::RecvTimeoutError;
@@ -255,10 +255,14 @@ fn run(config: Config) -> anyhow::Result<()> {
active_count: active_reflector_count,
} = setup_reflectors(&config)?;
let owd_baseline = Arc::new(Mutex::new(HashMap::<IpAddr, ReflectorStats>::new()));
let owd_recent = Arc::new(Mutex::new(HashMap::<IpAddr, ReflectorStats>::new()));
let (baseliner_stats_tx, baseliner_stats_rx) = flume::unbounded();
let (control_snapshot_tx, control_snapshot_rx) = flume::unbounded();
let (selection_snapshot_tx, selection_snapshot_rx) = if reselection_enabled {
let (tx, rx) = flume::unbounded();
(Some(tx), Some(rx))
} else {
(None, None)
};
let (error_tx, error_rx) = flume::unbounded::<anyhow::Error>();
let (reselect_tx, reselect_rx) = flume::bounded(1);
@@ -322,11 +326,11 @@ fn run(config: Config) -> anyhow::Result<()> {
let baseliner = Baseliner {
config: config.clone(),
owd_baseline: Arc::clone(&owd_baseline),
owd_recent: Arc::clone(&owd_recent),
reselect_trigger: reselect_tx.clone(),
start_time,
stats_rx: baseliner_stats_rx,
control_tx: control_snapshot_tx,
selection_tx: selection_snapshot_tx,
baseline_metrics,
event_metrics: event_metrics.clone(),
};
@@ -386,7 +390,8 @@ fn run(config: Config) -> anyhow::Result<()> {
if reselection_enabled {
let reflector_selector = ReflectorSelector {
config: config.clone(),
owd_recent: Arc::clone(&owd_recent),
snapshot_rx: selection_snapshot_rx
.expect("reselection snapshot receiver must exist when reselection is enabled"),
reflector_peers_lock: Arc::clone(&reflector_peers),
reflector_pool,
trigger_channel: reselect_rx,
@@ -418,8 +423,7 @@ fn run(config: Config) -> anyhow::Result<()> {
let mut ratecontroller = Ratecontroller::new(
config.clone(),
owd_baseline,
owd_recent,
control_snapshot_rx,
reflector_peers,
reselect_tx,
dl_direction,