Early-response RST_STREAM(NO_ERROR) counts toward max_local_error_reset_streams
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 80/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- rust
- Domain
- networking
Research direction
Start from Actions::send_reset and maybe_cancel in the h2 source. Find where the local error reset counter is incremented and add a condition to skip counting when the reason is NO_ERROR and the early-response path (is_send_closed() && is_recv_streaming()) is active. Add a test that triggers an early response and verifies the limit is not affected.
Written by the indexing model from the issue text.
Description
Actions::send_reset counts every library-initiated reset toward max_local_error_reset_streams (default 1024), including the RST_STREAM(NO_ERROR) that maybe_cancel sends when a server has fully responded before consuming the request body (RFC 9113 §8.1, the "early response" case the code comment cites). That reset is not an error and is not triggered by peer misbehaviour, but it counts like one.
Observed with a gRPC server (NativeLink, hyper 1.7 / h2 0.4.19, also present in 0.4.20) on a long-lived connection carrying CAS uploads. When a blob already exists, the server answers ByteStream.Write immediately (HEADERS + DATA + trailers with END_STREAM) and drops the request body; h2 then sends RST_STREAM(NO_ERROR). A packet capture of one connection showed 1,637 such NO_ERROR resets plus 903 STREAM_CLOSED, then GOAWAY(ENHANCE_YOUR_CALM, "too_many_internal_resets"), which tore down every in-flight upload on the connection. The client sent no DATA on any already-closed stream, and there was no REFUSED_STREAM or FLOW_CONTROL. The connection was well-behaved; the guard fired only because legitimate early responses accumulated.
Suggestion: do not count Reason::NO_ERROR resets produced by the early-response path (maybe_cancel with is_send_closed() && is_recv_streaming()) toward the local error reset limit, or count them separately. Related: #856, #966.
- Dominant language
- Rust
- Stars
- 1.6k
- Forks
- 395
- Avg merge
- 6h 3m
- Merged PRs (30d)
- 8
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from hyperium/h2
-
Raw fragments in :path are discarded before request-target validationPossibly taken @cfal claimed this 1 day ago. Open
Difficulty 3/5 1-2 days Newbie friendliness 20/100
Maintainers usually reply within 1 day
-
Oversized trailers bypass max_header_list_size and are silently truncatedPossibly taken @cfal claimed this 1 day ago. Open
Difficulty 4/5 3-5 days Newbie friendliness 20/100
Maintainers usually reply within 1 day
-
Pseudo-header fields in trailers are silently discardedPossibly taken @cfal claimed this 1 day ago. Open
Difficulty 3/5 1-2 days Newbie friendliness 25/100
Maintainers usually reply within 1 day
-
Trailers after a chained DATA frame always cost a second writePossibly taken @koshea claimed this 9 days ago. Open
Difficulty 4/5 3-5 days Newbie friendliness 30/100
Maintainers usually reply within 1 day
-
Receive flow-control stall after SETTINGS ACK shrinks the window with previously released capacityOpen
Difficulty 3/5 1-2 days Newbie friendliness 50/100
hyperium/h2#976 · 1 reaction ·
Maintainers usually reply within 1 day
Similar issues
-
BASEPRI needs an ISBOpen
Difficulty 2/5 1-3 hours Newbie friendliness 69/100
rust-embedded/cortex-m#702 · 1 comment ·
-
Make major, minor, and makedev safe on solarish targetsPossibly taken @xtqqczze claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
improvement/feedback improvement/workflow-project
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
higress-group/HiRoute#166 ·
Maintainers usually reply within 1 day
-
Proxy ignores l5d-retry-http and l5d-retry-grpc conditions that follow a comma and spacePossibly taken @RaphaelFakhri claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
Maintainers usually reply within 3 days
-
sncast panics when decoding a `u384` valuePossibly taken @RaphaelFakhri claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
foundry-rs/starknet-foundry#4635 ·
Maintainers usually reply within 3 days