Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.12] gh-79033: Try to fix asyncio.Server.wait_closed() again (GH-111336) #111424

Merged
merged 1 commit into from
Oct 28, 2023

Conversation

miss-islington
Copy link
Contributor

@miss-islington miss-islington commented Oct 28, 2023

  • Try to fix asyncio.Server.wait_closed() again

I identified the condition that wait_closed() is intended
to wait for: the server is closed and there are no more
active connections.

When this condition first becomes true, _wakeup() is called
(either from close() or from _detach()) and it sets _waiters
to None. So we just check for self._waiters is None; if it's
not None, we know we have to wait, and do so.

A problem was that the new test introduced in 3.12 explicitly
tested that wait_closed() returns immediately when the server
is not closed but there are currently no active connections.
This was a mistake (probably a misunderstanding of the intended
semantics). I've fixed the test, and added a separate test that
checks exactly for this scenario.

I also fixed an oddity where in _wakeup() the result of the
waiter was set to the waiter itself. This result is not used
anywhere and I changed this to None, to avoid a GC cycle.

  • Update Lib/asyncio/base_events.py

(cherry picked from commit 2655369)

Co-authored-by: Guido van Rossum guido@python.org
Co-authored-by: Carol Willing carolcode@willingconsulting.com


📚 Documentation preview 📚: https://cpython-previews--111424.org.readthedocs.build/

…GH-111336)

* Try to fix asyncio.Server.wait_closed() again

I identified the condition that `wait_closed()` is intended
to wait for: the server is closed *and* there are no more
active connections.

When this condition first becomes true, `_wakeup()` is called
(either from `close()` or from `_detach()`) and it sets `_waiters`
to `None`. So we just check for `self._waiters is None`; if it's
not `None`, we know we have to wait, and do so.

A problem was that the new test introduced in 3.12 explicitly
tested that `wait_closed()` returns immediately when the server
is *not* closed but there are currently no active connections.
This was a mistake (probably a misunderstanding of the intended
semantics). I've fixed the test, and added a separate test that
checks exactly for this scenario.

I also fixed an oddity where in `_wakeup()` the result of the
waiter was set to the waiter itself. This result is not used
anywhere and I changed this to `None`, to avoid a GC cycle.

* Update Lib/asyncio/base_events.py

---------

(cherry picked from commit 2655369)

Co-authored-by: Guido van Rossum <guido@python.org>
Co-authored-by: Carol Willing <carolcode@willingconsulting.com>
@willingc willingc enabled auto-merge (squash) October 28, 2023 18:31
@willingc willingc merged commit 2e5d4e2 into python:3.12 Oct 28, 2023
28 checks passed
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.

3 participants