fix: HTTP/1 active-request metrics leak when response ends before request body completes - #6329
Closed
waterWang wants to merge 2 commits into
Closed
Conversation
waterWang
added a commit
to waterWang/vert.x
that referenced
this pull request
Aug 22, 2026
…lose Add a test that sends a GET with Content-Length but no body, has the server respond early (401), and then closes the connection. Asserts that the request metric's failed flag is set (requestReset was called), confirming the active-request gauge does not leak. Related to eclipse-vertx#6329 (fix for eclipse-vertx#6328)
… request body completes When the server sends an early response (before the full request body is received) and the client then closes the connection, the request metrics never receive requestEnd or requestReset, causing the active-request gauge to retain the request forever. The root cause is that Http1ServerConnection.handleClosed() only cleans up metrics for responseInProgress, but not for requestInProgress when the request body never completed (no LastHttpContent received). This fix ensures that requestReset is called on the pending request metric when the connection is closed with an incomplete request body. Fixes eclipse-vertx#6328
…lose Add a test that sends a GET with Content-Length but no body, has the server respond early (401), and then closes the connection. Asserts that the request metric's failed flag is set (requestReset was called), confirming the active-request gauge does not leak. Related to eclipse-vertx#6329 (fix for eclipse-vertx#6328)
tsegismont
force-pushed
the
fix/http1-active-request-metric-leak
branch
from
August 28, 2026 12:57
e828fb6 to
4efe26e
Compare
Member
|
Superseded by #6336 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fix HTTP/1 active-request metrics leak when connection closes before request body completes
Problem
When an HTTP/1 server ends the response before the request body has fully arrived, and the client then closes the connection without completing the declared body, Micrometer receives
requestBeginandresponseEnd, but neitherrequestEndnorrequestReset. Thevertx_http_server_active_requestsgauge therefore retains the request forever, increasing monotonically with each connection.Example: a client sends
GET /withContent-Length: 1, the server responds401early, the client closes without sending the byte.Root cause
Http1ServerConnection.handleClosed()only cleans up metrics forresponseInProgress(viahandleException), but when the response has already been sent theresponseInProgressfield isnull. TherequestInProgressstill references the request whose body never completed (requestEndwas never reported), and when the connection closes the request metric is never reset.Fix
In
handleClosed(), after handlingresponseInProgress, also reportrequestResetonrequestInProgresswhen:responseInProgress!isEnded())This matches the existing metric invariants: every
requestBeginmust be paired with exactly one terminal event (requestEndorrequestReset).