From 00704fbdfe71c5a50b6b179ee463798b63360be6 Mon Sep 17 00:00:00 2001 From: Brent Echols Date: Sat, 15 Aug 2026 14:17:10 -0700 Subject: [PATCH] perf: defer send buffer locking while receiving --- src/proto/streams/streams.rs | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/proto/streams/streams.rs b/src/proto/streams/streams.rs index ba326d0d..46955159 100644 --- a/src/proto/streams/streams.rs +++ b/src/proto/streams/streams.rs @@ -536,8 +536,6 @@ impl Inner { } let actions = &mut self.actions; - let mut send_buffer = send_buffer.inner.lock().unwrap(); - let send_buffer = &mut *send_buffer; self.counts.transition(stream, |counts, stream| { tracing::trace!( @@ -551,8 +549,9 @@ impl Inner { Ok(()) => Ok(()), Err(RecvHeaderBlockError::Oversize(resp)) => { if let Some(resp) = resp { + let mut send_buffer = send_buffer.inner.lock().unwrap(); let sent = actions.send.send_headers( - resp, send_buffer, stream, counts, &mut actions.task); + resp, &mut send_buffer, stream, counts, &mut actions.task); debug_assert!(sent.is_ok(), "oversize response should not fail"); actions.send.schedule_implicit_reset( @@ -581,7 +580,7 @@ impl Inner { actions.recv.recv_trailers(frame, stream) }; - actions.reset_on_recv_stream_err(send_buffer, stream, counts, res) + actions.reset_on_recv_stream_err_deferred(send_buffer, stream, counts, res) }) } @@ -633,8 +632,6 @@ impl Inner { }; let actions = &mut self.actions; - let mut send_buffer = send_buffer.inner.lock().unwrap(); - let send_buffer = &mut *send_buffer; self.counts.transition(stream, |counts, stream| { let sz = frame.flow_controlled_len(); @@ -648,7 +645,7 @@ impl Inner { .recv .release_connection_capacity(sz as WindowSize, &mut None); } - actions.reset_on_recv_stream_err(send_buffer, stream, counts, res) + actions.reset_on_recv_stream_err_deferred(send_buffer, stream, counts, res) }) } @@ -1739,6 +1736,21 @@ impl Actions { }) } + fn reset_on_recv_stream_err_deferred( + &mut self, + send_buffer: &SendBuffer, + stream: &mut store::Ptr, + counts: &mut Counts, + res: Result<(), Error>, + ) -> Result<(), Error> { + if matches!(res, Err(Error::Reset(..))) { + let mut send_buffer = send_buffer.inner.lock().unwrap(); + self.reset_on_recv_stream_err(&mut send_buffer, stream, counts, res) + } else { + res + } + } + fn reset_on_recv_stream_err( &mut self, buffer: &mut Buffer>,