Repository navigation
Socket timeouts are checked before pending incoming requests are assigned sockets, causing ECONNRESETs #43456
Description
Activity
- addedhttpIssues and PRs related to the http subsystem.Issues and PRs related to the http subsystem.
on Jun 17, 2022 Hm, that's not how I interpret these logs. In this capture, the highlighted row (13) is the 3rd request:
And the corresponding Node.js logs:
11:14:40.382 [0] assigned socket 0 11:14:40.384 [1] assigned socket 1 11:14:41.901 [0] res.end 11:14:41.902 [2] assigned socket 0 11:14:43.407 [1] res.end 11:14:43.409 [2] req.error Error: read ECONNRESET11:14:40.386 [0] got request on socket 0 11:14:41.897 [0] sending response 11:14:41.900 Setting timeout on socket 0 11:14:41.901 [1] got request on socket 1 11:14:43.406 [1] sending response 11:14:43.407 Setting timeout on socket 1 11:14:43.408 Closing 0 11:14:43.412 Closing 1Key points:
- Client's request is assigned a socket at 41.902
- Server receives the the request at 41.902 (13)
- Server sets timeout on socket at 43.407
- Server closes socket at 43.412 just 5 ms later, even though it looks like there's a request that could use it since 41.902. (I think that closure is the FIN in row 19)
Sorry, i can not get the point. The reason why the socket 1 is closed(by client) early(5 ms) is the client have exited, when you add setInterval(() => {}, 10000) to client.js. the socket 1 will be closed by server after 1 s.
The process is as follow.- client sends two reqs concurrently.
- server receives req 0 on socket 0, handle it, setTimeout 1s.
- client sends the third req(req 2) on socket 0 to server.
- server receives req 1 on socket 1, handle it, setTimeout 1s.
after req 1 is handled socket 0 is timeout before receive req 2, and the timeout callback destroy the socket 0 which make the client exit and close the socket 1.
Client assigned req 2
11:14:41.902 [2] assigned socket 0server closed socket 0
11:14:43.408 Closing 0Why socket 0 didnt handle req 2? It came before the socket closed on server and before timeout (1 sec after sending response).
Reacted by Zach Bjornsongithub-actions commented
on Jun 25, 2026 on Jun 25, 2026 – with GitHub ActionsContributorMore actionsThis issue has been marked as stale due to 210 days of inactivity.
It will be automatically closed in 30 days if no further activity occurs. If this is still relevant, please leave a comment or update it to keep it open.- addedstaleIssues and PRs marked stale due to inactivity and scheduled for automatic closure.Issues and PRs marked stale due to inactivity and scheduled for automatic closure.
on Jun 25, 2026 github-actions commented
on Jul 26, 2026 on Jul 26, 2026 – with GitHub ActionsContributorMore actionsThis issue has been automatically closed after 30 days of inactivity following its stale status (no activity for a total of 120 days).
If this is still relevant, feel free to reopen it or leave a comment with additional details so we can continue the discussion.


Version
14.19.1 and others
Platform
Linux qa01-api-1 5.13.0-1024-gcp #29~20.04.1-Ubuntu SMP Thu Apr 14 23:15:00 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
Subsystem
net
What steps will reproduce the bug?
Process 1:
Process 2:
How often does it reproduce? Is there a required condition?
100%
What is the expected behavior?
All three requests should succeed.
What do you see instead?
The server logs will look like this:
and client
Notice: req[2] is assigned a socket at 51.815, just after req[1] is received by the server. Server socket[0] is closed at 53.320, just after the blocking work on req[2], even though there's a request that could be assigned to that socket. I think what's happening is that timers are checked before pending incoming messages are assigned sockets.
Additional information
ECONNRESETs due to Keep-Alive races need to be handled by clients (see #20256, #38890 and several others), but I think this particular scenario can be fixed to avoid a subset of them.