bpo-33833: Fix ProactorSocketTransport AssertionError (GH-7893) · python/cpython@d5c75be

3 files changed

lines changed

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

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

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.