Title: _ProactorDatagramTransport: If close() is called when write buffer is not empty, the remaining data is not sent and connection_lost is not called
Type: behavior Stage: patch review
Components: asyncio, Windows Versions: Python 3.9, Python 3.8
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: asvetlov, paul.moore, primal, steve.dower, tim.golden, yselivanov, zach.ware
Priority: normal Keywords: patch

Created on 2019-10-14 10:42 by primal, last changed 2019-10-20 13:33 by primal.

Pull Requests
URL Status Linked Edit
PR 16779 closed primal, 2019-10-14 14:01
PR 16863 open primal, 2019-10-20 13:33
Messages (1)
msg354626 - (view) Author: Paul Martin (primal) * Date: 2019-10-14 10:42
Expected behaviour for DatagramTransport (from_SelectorDatagramTransport):

transport.close() called.
If there is data in the write buffer, don't call connection_lost.
When all data is written and the buffer is empty, check if connection has been lost and if so, call connection_lost

However for _ProactorDatagramTransport, if close is called with data in the buffer, _loop_writing returns immediately, so it never gets to the point of sending the remaining data or calling connection_lost. The code for calling connection_lost inside _loop_writing is completely unreachable, because the method immediately returns if the connection has been lost.
Date User Action Args
2019-10-20 13:33:15primalsetpull_requests: + pull_request16408
2019-10-14 14:01:06primalsetkeywords: + patch
stage: patch review
pull_requests: + pull_request16341
2019-10-14 10:42:49primalsetversions: + Python 3.9
2019-10-14 10:42:35primalcreate