Skip to content

fix: HTTP/1 active-request metrics leak when response ends before request body completes - #6329

Closed
waterWang wants to merge 2 commits into
eclipse-vertx:masterfrom
waterWang:fix/http1-active-request-metric-leak
Closed

fix: HTTP/1 active-request metrics leak when response ends before request body completes#6329
waterWang wants to merge 2 commits into
eclipse-vertx:masterfrom
waterWang:fix/http1-active-request-metric-leak

Conversation

@waterWang

@waterWang waterWang commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

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 requestBegin and responseEnd, but neither requestEnd nor requestReset. The vertx_http_server_active_requests gauge therefore retains the request forever, increasing monotonically with each connection.

Example: a client sends GET / with Content-Length: 1, the server responds 401 early, the client closes without sending the byte.

Root cause

Http1ServerConnection.handleClosed() only cleans up metrics for responseInProgress (via handleException), but when the response has already been sent the responseInProgress field is null. The requestInProgress still references the request whose body never completed (requestEnd was never reported), and when the connection closes the request metric is never reset.

Fix

In handleClosed(), after handling responseInProgress, also report requestReset on requestInProgress when:

  • it is a different request from responseInProgress
  • its body did not complete (!isEnded())

This matches the existing metric invariants: every requestBegin must be paired with exactly one terminal event (requestEnd or requestReset).

@waterWang waterWang changed the title fix: HTTP/1 active-request metrics leak when response ends before request body completes [fj4WqyCCw3C5ShR1RfB7MoBPTpkRrBFYP1uT35g3MvT] fix: HTTP/1 active-request metrics leak when response ends before request body completes Aug 22, 2026
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
tsegismont force-pushed the fix/http1-active-request-metric-leak branch from e828fb6 to 4efe26e Compare August 28, 2026 12:57
@tsegismont

Copy link
Copy Markdown
Member

Superseded by #6336

@tsegismont tsegismont closed this Aug 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants