#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum Admit {
Add,
Stop,
}
#[derive(Clone, Debug)]
pub struct Admission {
samples: Vec<f64>,
levels: Vec<usize>,
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(),
levels: Vec::new(),
min_gain_frac,
max_conns: max_conns.max(1),
settled: None,
}
}
pub fn observe_at(&mut self, level: usize, goodput: f64) -> Admit {
let level = level.max(1);
self.samples.push(goodput.max(0.0));
self.levels.push(level);
let n = self.samples.len();
if level >= self.max_conns {
self.settled = Some(self.best_level());
return Admit::Stop;
}
if n == 1 {
return Admit::Add;
}
if !self.step_pays(n - 1) {
self.settled = Some(self.best_level());
Admit::Stop
} else {
Admit::Add
}
}
fn step_pays(&self, i: usize) -> bool {
if i == 0 || i >= self.samples.len() {
return false;
}
let prev_rate = self.samples[i - 1].max(1.0);
let prev_level = self.levels[i - 1].max(1) as f64;
let this_level = self.levels[i].max(1) as f64;
if this_level <= prev_level {
return false;
}
let ideal = prev_rate * (this_level / prev_level);
let headroom = (ideal - prev_rate).max(1e-9);
(self.samples[i] - prev_rate) / headroom >= self.min_gain_frac
}
fn best_level(&self) -> usize {
if self.samples.is_empty() {
return 1;
}
let mut best = self.levels.first().copied().unwrap_or(1);
for i in 1..self.samples.len() {
if self.step_pays(i) {
best = self.levels[i];
} else {
break;
}
}
best.clamp(1, self.max_conns)
}
pub fn observe(&mut self, goodput: f64) -> Admit {
let level = self.samples.len() + 1;
self.observe_at(level, goodput)
}
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 a_doubling_caller_settles_on_a_real_connection_count() {
let mut a = Admission::new(0.15, 8);
assert_eq!(a.observe_at(1, 1.00e6), Admit::Add);
assert_eq!(
a.observe_at(2, 1.01e6),
Admit::Stop,
"1% per added conn is noise"
);
assert_eq!(
a.settled(),
Some(1),
"must settle at ONE connection, not at a sample index"
);
let mut b = Admission::new(0.15, 8);
assert_eq!(b.observe_at(1, 1.0e6), Admit::Add);
assert_eq!(b.observe_at(2, 2.0e6), Admit::Add);
assert_eq!(b.observe_at(4, 4.0e6), Admit::Add);
assert_eq!(b.observe_at(8, 8.0e6), Admit::Stop, "ceiling is a stop");
assert_eq!(
b.settled(),
Some(8),
"a path that scales to the ceiling must settle AT the ceiling; \
four samples reached level 8 and the old sample-count test never fired"
);
}
#[test]
fn gain_is_normalised_by_connections_added() {
let mut a = Admission::new(0.15, 16);
assert_eq!(a.observe_at(1, 1.00e6), Admit::Add);
assert_eq!(a.observe_at(2, 1.20e6), Admit::Add, "20% for one conn pays");
assert_eq!(
a.observe_at(8, 1.60e6),
Admit::Stop,
"a 6x jump in connections must not pass on the strength of the raw delta"
);
assert_eq!(a.settled(), Some(2), "settle at the level that last paid");
}
#[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"
);
}
}