Skip to content

Commit d5c75be

Browse files
bpo-33833: Fix ProactorSocketTransport AssertionError (GH-7893)
(cherry picked from commit 9045199) Co-authored-by: twisteroid ambassador <[email protected]>
1 parent 399b47f commit d5c75be

File tree

3 files changed

+19
-0
lines changed

3 files changed

+19
-0
lines changed

Lib/asyncio/proactor_events.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,10 @@ def write(self, data):
343343

344344
def _loop_writing(self, f=None, data=None):
345345
try:
346+
if f is not None and self._write_fut is None and self._closing:
347+
# XXX most likely self._force_close() has been called, and
348+
# it has set self._write_fut to None.
349+
return
346350
assert f is self._write_fut
347351
self._write_fut = None
348352
self._pending_write = 0

Lib/test/test_asyncio/test_proactor_events.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,19 @@ def test_force_close(self):
253253
self.assertEqual(None, tr._buffer)
254254
self.assertEqual(tr._conn_lost, 1)
255255

256+
def test_loop_writing_force_close(self):
257+
exc_handler = mock.Mock()
258+
self.loop.set_exception_handler(exc_handler)
259+
fut = asyncio.Future(loop=self.loop)
260+
fut.set_result(1)
261+
self.proactor.send.return_value = fut
262+
263+
tr = self.socket_transport()
264+
tr.write(b'data')
265+
tr._force_close(None)
266+
test_utils.run_briefly(self.loop)
267+
exc_handler.assert_not_called()
268+
256269
def test_force_close_idempotent(self):
257270
tr = self.socket_transport()
258271
tr._closing = True
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fixed bug in asyncio where ProactorSocketTransport logs AssertionError if
2+
force closed during write.

0 commit comments

Comments
 (0)