diff --git a/crates/collab-net/src/driver.rs b/crates/collab-net/src/driver.rs index 622b6c52d..a570836d3 100644 --- a/crates/collab-net/src/driver.rs +++ b/crates/collab-net/src/driver.rs @@ -165,6 +165,8 @@ impl Driver { fn connect(&mut self, now: Instant) { self.reconnect_at = None; + // A server counts per connection. + self.pace = Pace::new(now); self.conn = Some(Conn::new(now)); if let Err(e) = self.sock.open(&self.server().url()) { self.dropped(e, now); diff --git a/crates/collab-net/src/driver_tests.rs b/crates/collab-net/src/driver_tests.rs index 83684db7e..69cafb929 100644 --- a/crates/collab-net/src/driver_tests.rs +++ b/crates/collab-net/src/driver_tests.rs @@ -392,6 +392,24 @@ fn a_long_queue_goes_out_paced_and_in_order() { assert_eq!(d.deadline().unwrap() - now, ms(500), "nothing left to send but the reconnect"); } +#[test] +fn a_new_connection_starts_with_a_fresh_pace() { + let t0 = Instant::now(); + let (mut d, _inbox) = start(Script::default(), t0); + d.opened(t0); + d.message(&welcome(), t0); + for seq in 0..500 { + d.send(ClientMsg::Ack { seq }, t0); + } + d.closed(1006, "", t0); + let back = d.deadline().unwrap(); + d.tick(back); + d.opened(back); + d.message(&welcome(), back); + d.send(ClientMsg::Ack { seq: 900 }, back); + assert!(d.sock.sent.iter().any(|m| matches!(m, ClientMsg::Ack { seq: 900 })), "sent at once"); +} + #[test] fn leaving_sends_what_was_waiting_its_turn() { let t0 = Instant::now();