From f757bfbb7eda287c53fae2bfc0e20ba49794bd87 Mon Sep 17 00:00:00 2001 From: Benjamin Saunders Date: Sat, 18 Apr 2020 11:32:43 -0700 Subject: [PATCH] Update send window to account for reset streams immediately Frees resources sooner and opens the way for per-stream send buffers without compromising send window tracking when streams are destroyed. --- quinn-proto/src/connection.rs | 19 +++++++++++-------- quinn-proto/src/streams.rs | 10 ---------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/quinn-proto/src/connection.rs b/quinn-proto/src/connection.rs index a02de514c..a5a2948ae 100644 --- a/quinn-proto/src/connection.rs +++ b/quinn-proto/src/connection.rs @@ -898,6 +898,17 @@ where "only streams supporting outgoing data may be reset" ); + // Drain queued data + let unacked_data = &mut self.unacked_data; + self.streams.pending.retain(|frame| { + if frame.id == stream_id { + *unacked_data -= frame.data.len() as u64; + false + } else { + true + } + }); + let stop_reason = if stopped { Some(error_code) } else { None }; let status = self.streams.reset(stream_id, stop_reason); let was_conn_blocked = self.blocked_streams.remove(&stream_id); @@ -2599,14 +2610,6 @@ where Some(x) => x, None => break, }; - if self - .streams - .send_mut(stream.id) - .map_or(true, |s| s.state.was_reset()) - { - self.unacked_data -= stream.data.len() as u64; - continue; - } let len = cmp::min( stream.data.len(), max_size as usize - buf.len() - frame::Stream::SIZE_BOUND, diff --git a/quinn-proto/src/streams.rs b/quinn-proto/src/streams.rs index 736c1c373..3a881ccff 100644 --- a/quinn-proto/src/streams.rs +++ b/quinn-proto/src/streams.rs @@ -563,16 +563,6 @@ pub(crate) enum SendState { ResetRecvd { stop_reason: Option }, } -impl SendState { - pub fn was_reset(self) -> bool { - use self::SendState::*; - match self { - ResetSent { .. } | ResetRecvd { .. } => true, - _ => false, - } - } -} - #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub(crate) enum RecvState { Recv { size: Option },