Skip to content

Fix EventletConnection close() race: set last_error to prevent returning dead connections#702

Draft
dkropachev wants to merge 1 commit intomasterfrom
fix/eventlet-close-race-614
Draft

Fix EventletConnection close() race: set last_error to prevent returning dead connections#702
dkropachev wants to merge 1 commit intomasterfrom
fix/eventlet-close-race-614

Conversation

@dkropachev
Copy link
Collaborator

@dkropachev dkropachev commented Feb 14, 2026

Summary

Fixes a race condition in EventletConnection.close() where factory() could return a dead connection because last_error was never set.

  • When close() is called before the handshake completes (connected_event not yet set), factory() checks last_error to decide whether to return the connection. Without last_error set, it could return a connection that was already closed.
  • When the server closes the connection (EOF in handle_read()), last_error was not set before calling close(), leading to the same issue.

Changes

  • Set last_error in close() when connected_event has not been set yet, so factory() knows the connection failed
  • Set last_error on server-initiated close (EOF) in handle_read() before calling close()

Test plan

  • EVENT_LOOP_MANAGER=eventlet uv run pytest tests/unit/io/test_eventletreactor.py passes

Refs #614

@dkropachev dkropachev marked this pull request as draft February 14, 2026 16:40
@dkropachev dkropachev force-pushed the fix/eventlet-close-race-614 branch from ac1f652 to 08535c5 Compare February 16, 2026 13:03
EventletConnection.close() uses blocking kill() which mostly prevents
races, but if close() is called from a non-eventlet thread the
greenthread may not be interrupted as expected.

- Add is_closed/is_defunct guards in handle_read() and handle_write()
  error paths to silently exit during shutdown
- Set last_error in close() when connected_event is not yet set to
  prevent factory() from returning a dead connection
- Set last_error on server-initiated close (EOF) in handle_read()
@dkropachev dkropachev force-pushed the fix/eventlet-close-race-614 branch from 08535c5 to d30278c Compare February 16, 2026 13:09
@dkropachev dkropachev changed the title Fix EventletConnection close() race causing EBADF errors Fix EventletConnection close() race: set last_error to prevent returning dead connections Feb 16, 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.

1 participant