#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum Admit {
Add,
Stop,
}
#[derive(Clone, Debug)]
pub struct Admission {
samples: Vec<f64>,
min_gain_frac: f64,
max_conns: usize,
settled: Option<usize>,
}
impl Admission {
pub fn new(min_gain_frac: f64, max_conns: usize) -> Self {
Self {
samples: Vec::new(),
min_gain_frac,
max_conns: max_conns.max(1),
settled: None,
}
}
pub fn observe(&mut self, goodput: f64) -> Admit {
self.samples.push(goodput.max(0.0));
let n = self.samples.len();
if n >= self.max_conns {
self.settled = Some(n);
return Admit::Stop;
}
if n == 1 {
return Admit::Add;
}
let base = self.samples[0].max(1.0);
let gain = self.samples[n - 1] - self.samples[n - 2];
if gain < self.min_gain_frac * base {
self.settled = Some(n - 1);
Admit::Stop
} else {
Admit::Add
}
}
pub fn level(&self) -> usize {
self.samples.len()
}
pub fn settled(&self) -> Option<usize> {
self.settled
}
pub fn best_goodput(&self) -> f64 {
self.samples.iter().cloned().fold(0.0, f64::max)
}
}
#[derive(Clone, Copy, Debug)]
pub struct DeltaEstimator {
ewma: f64,
alpha: f64,
n: u32,
}
impl DeltaEstimator {
pub fn new(prior_s: f64) -> Self {
Self {
ewma: prior_s.max(1e-4),
alpha: 0.3,
n: 0,
}
}
pub fn observe(&mut self, ttfb_s: f64) {
let x = ttfb_s.clamp(1e-4, 30.0);
if self.n == 0 {
self.ewma = x;
} else {
self.ewma = (1.0 - self.alpha) * self.ewma + self.alpha * x;
}
self.n = self.n.saturating_add(1);
}
pub fn get(&self) -> f64 {
self.ewma
}
pub fn samples(&self) -> u32 {
self.n
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn saturated_path_settles_at_one() {
let mut a = Admission::new(0.15, 8);
assert_eq!(a.observe(1.0e6), Admit::Add);
assert_eq!(a.observe(1.02e6), Admit::Stop, "2% gain must be refused");
assert_eq!(
a.settled(),
Some(1),
"must settle at ONE, not at the probed 2"
);
}
#[test]
fn scalable_path_admits_until_knee() {
let mut a = Admission::new(0.15, 12);
let curve = [1.0e6, 2.0e6, 3.0e6, 4.0e6, 4.0e6, 4.0e6];
let mut last = Admit::Add;
for g in curve {
last = a.observe(g);
if last == Admit::Stop {
break;
}
}
assert_eq!(last, Admit::Stop);
assert_eq!(a.settled(), Some(4), "must find the knee at rho/gamma = 4");
}
#[test]
fn respects_politeness_ceiling() {
let mut a = Admission::new(0.01, 3);
for g in [1.0e6, 2.0e6, 3.0e6] {
a.observe(g);
}
assert_eq!(
a.settled(),
Some(3),
"ceiling binds even when gains continue"
);
}
#[test]
fn delta_estimator_tracks_a_step_change() {
let mut d = DeltaEstimator::new(0.15);
for _ in 0..12 {
d.observe(0.42);
}
assert!(
(d.get() - 0.42).abs() < 0.02,
"estimator must converge on the observed cost, got {}",
d.get()
);
assert_eq!(d.samples(), 12);
}
#[test]
fn delta_estimator_first_sample_replaces_prior() {
let mut d = DeltaEstimator::new(0.005);
d.observe(0.40);
assert!(
d.get() > 0.3,
"a wildly wrong prior must not survive one sample"
);
}
}