Skip to content

Commit 778aa7e

Browse files
fix: notify_recv after send_reset() in reset_on_recv_stream_err() to ensure local stream is released properly (#816)
Similar to what have been done in fn send_reset<B>(), we should notify RecvStream that is parked after send_reset(). Co-authored-by: Jiahao Liang <[email protected]>
1 parent be10b77 commit 778aa7e

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

src/proto/streams/streams.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1549,6 +1549,9 @@ impl Actions {
15491549
// Reset the stream.
15501550
self.send
15511551
.send_reset(reason, initiator, buffer, stream, counts, &mut self.task);
1552+
self.recv.enqueue_reset_expiration(stream, counts);
1553+
// if a RecvStream is parked, ensure it's notified
1554+
stream.notify_recv();
15521555
Ok(())
15531556
} else {
15541557
tracing::warn!(

tests/h2-tests/tests/stream_states.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,12 @@ async fn recv_next_stream_id_updated_by_malformed_headers() {
536536
client.recv_frame(frames::go_away(1).protocol_error()).await;
537537
};
538538
let srv = async move {
539-
let mut srv = server::handshake(io).await.expect("handshake");
539+
let mut srv = server::Builder::new()
540+
// forget the bad stream immediately
541+
.max_concurrent_reset_streams(0)
542+
.handshake::<_, Bytes>(io)
543+
.await
544+
.expect("handshake");
540545
let res = srv.next().await.unwrap();
541546
let err = res.unwrap_err();
542547
assert_eq!(err.reason(), Some(h2::Reason::PROTOCOL_ERROR));

0 commit comments

Comments
 (0)