This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author vstinner
Recipients asvetlov, paul.moore, steve.dower, tim.golden, vstinner, yselivanov, zach.ware
Date 2019-01-08.00:50:48
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1546908648.7.0.754492801962.issue35682@roundup.psfhosted.org>
In-reply-to
Content
Running ProactorEventLoopTests.test_sendfile_close_peer_in_the_middle_of_receiving() logs a bug in _force_close(): see logs below. Extract of _force_close():

    def _force_close(self, exc):
        if self._empty_waiter is not None:
            if exc is None:
                self._empty_waiter.set_result(None)
            else:
                self._empty_waiter.set_exception(exc)
        ...

Problem: _empty_waiter can be already done. For example, it can be created directly as done:

    def _make_empty_waiter(self):
        ...
        self._empty_waiter = self._loop.create_future()
        if self._write_fut is None:
            self._empty_waiter.set_result(None)
        return self._empty_waiter

Attached PR fixes _force_close(): do nothing if _empty_waiter is already done.

The regression comes from the following change:

commit a19fb3c6aaa7632410d1d9dcb395d7101d124da4
Author: Andrew Svetlov <andrew.svetlov@gmail.com>
Date:   Sun Feb 25 19:32:14 2018 +0300

    bpo-32622: Native sendfile on windows (#5565)
    
    * Support sendfile on Windows Proactor event loop naively.


Logs:

vstinner@WIN C:\vstinner\python\master>python -X dev -m test test_asyncio -m test.test_asyncio.test_sendfile.ProactorEventLoopTests.test_sendfile_close_peer_in_the_middle_of_receiving
Running Debug|x64 interpreter...
Run tests sequentially 
0:00:00 [1/1] test_asyncio 
Exception in callback _ProactorReadPipeTransport._loop_reading(<_OverlappedF...events.py:452>) 
handle: <Handle _ProactorReadPipeTransport._loop_reading(<_OverlappedF...events.py:452>) created at C:\vstinner\python\master\lib\asyncio\windows_events.py:82>
source_traceback: Object created at (most recent call last):
  File "C:\vstinner\python\master\lib\test\test_asyncio\test_sendfile.py", line 125, in run_loop
    return self.loop.run_until_complete(coro)
  File "C:\vstinner\python\master\lib\asyncio\base_events.py", line 576, in run_until_complete
    self.run_forever()
  File "C:\vstinner\python\master\lib\asyncio\windows_events.py", line 315, in run_forever
    super().run_forever()
  File "C:\vstinner\python\master\lib\asyncio\base_events.py", line 544, in run_forever
    self._run_once()
  File "C:\vstinner\python\master\lib\asyncio\base_events.py", line 1729, in _run_once
    event_list = self._selector.select(timeout)
  File "C:\vstinner\python\master\lib\asyncio\windows_events.py", line 421, in select
    self._poll(timeout)
  File "C:\vstinner\python\master\lib\asyncio\windows_events.py", line 750, in _poll
    f.set_exception(e)
  File "C:\vstinner\python\master\lib\asyncio\windows_events.py", line 82, in set_exception
    super().set_exception(exception)
Traceback (most recent call last):
  File "C:\vstinner\python\master\lib\asyncio\windows_events.py", line 444, in finish_recv
    return ov.getresult()
OSError: [WinError 64] The specified network name is no longer available

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\vstinner\python\master\lib\asyncio\proactor_events.py", line 256, in _loop_reading
    data = fut.result()
  File "C:\vstinner\python\master\lib\asyncio\windows_events.py", line 748, in _poll
    value = callback(transferred, key, ov)
  File "C:\vstinner\python\master\lib\asyncio\windows_events.py", line 448, in finish_recv
    raise ConnectionResetError(*exc.args)
ConnectionResetError: [WinError 64] The specified network name is no longer available

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\vstinner\python\master\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "C:\vstinner\python\master\lib\asyncio\proactor_events.py", line 283, in _loop_reading
    self._force_close(exc)
  File "C:\vstinner\python\master\lib\asyncio\proactor_events.py", line 118, in _force_close
    self._empty_waiter.set_exception(exc)
asyncio.exceptions.InvalidStateError: invalid state

== Tests result: SUCCESS ==

1 test OK.

Total duration: 531 ms
Tests result: SUCCESS
History
Date User Action Args
2019-01-08 00:50:50vstinnersetrecipients: + vstinner, paul.moore, tim.golden, asvetlov, zach.ware, yselivanov, steve.dower
2019-01-08 00:50:48vstinnersetmessageid: <1546908648.7.0.754492801962.issue35682@roundup.psfhosted.org>
2019-01-08 00:50:48vstinnerlinkissue35682 messages
2019-01-08 00:50:48vstinnercreate