classification
Title: asyncio windows_events.py IocpProactor bug
Type: Stage: resolved
Components: asyncio Versions: Python 3.7
process
Status: closed Resolution: duplicate
Dependencies: Superseder: False timeout log message on proactor close
View: 34323
Assigned To: Nosy List: asvetlov, jeffr@livedata.com, vstinner, yselivanov
Priority: normal Keywords:

Created on 2018-12-28 01:22 by jeffr@livedata.com, last changed 2019-01-15 12:09 by vstinner. This issue is now closed.

Messages (3)
msg332632 - (view) Author: Jeff Robbins (jeffr@livedata.com) * Date: 2018-12-28 01:22
The close() method of IocpProactor in windows_events.py has this code in its close() method:

        while self._cache:
            if not self._poll(1):
                logger.debug('taking long time to close proactor')

The bug is that self._poll() has *no* return statements in it, and so returns None no matter what.  Which makes the "if not" part confusing, at best.  At worst, it might reflect a disconnect with the author's intent.

I added a bit more logging and re-ran my test:

        while self._cache:
            logger.debug('before self._poll(1)')
            if not self._poll(1):
                logger.debug('taking long time to close proactor')
                logger.debug(f'{self._cache}')


logger output:

20:16:30.247 (D)   MainThread                      asyncio: before self._poll(1)
20:16:30.248 (D)   MainThread                      asyncio: taking long time to close proactor
20:16:30.249 (D)   MainThread                      asyncio: {}


Obviously 1 millisecond isn't "taking a long time to close proactor".  Also of interest, the _cache is now empty.  

I think the intent of the author must have been to check if the call to ._poll() cleared out any possible pending futures, or waited the full 1 second.  Since ._poll() doesn't return any value to differentiate if it waited the full wait period or not, the "if" is wrong, and, I think, the intent of the author isn't met by this code.

But, separate from speculating on "intent", the debug output of "taking a long time to close proactor" seems wrong, and the .close() code seems disassociated with the implementation of ._poll() in the same class IocpProactor in windows_events.py.
msg332735 - (view) Author: Jeff Robbins (jeffr@livedata.com) * Date: 2018-12-29 21:04
This issue is likely a duplicate of https://bugs.python.org/issue34323
which was reported in Python 3.5.
msg333690 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2019-01-15 12:09
I confirm that it's a duplicate of bpo-34323 that I just fixed ;-)
History
Date User Action Args
2019-01-15 12:09:20vstinnersetstatus: open -> closed

superseder: False timeout log message on proactor close

nosy: + vstinner
messages: + msg333690
resolution: duplicate
stage: resolved
2018-12-29 21:04:55jeffr@livedata.comsetmessages: + msg332735
2018-12-28 01:22:04jeffr@livedata.comcreate