Skip to content

Commit 319c034

Browse files
julien-duponchelle1st1
authored andcommitted
bpo-29711: Fix stop_serving in proactor loop kill all listening servers (#431)
1 parent 36c2c04 commit 319c034

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

Lib/asyncio/proactor_events.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,8 @@ def _stop_accept_futures(self):
536536
self._accept_futures.clear()
537537

538538
def _stop_serving(self, sock):
539-
self._stop_accept_futures()
539+
future = self._accept_futures.pop(sock.fileno(), None)
540+
if future:
541+
future.cancel()
540542
self._proactor._stop_serving(sock)
541543
sock.close()

Lib/test/test_asyncio/test_proactor_events.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -567,10 +567,21 @@ def test_create_server_cancel(self):
567567
self.assertTrue(self.sock.close.called)
568568

569569
def test_stop_serving(self):
570-
sock = mock.Mock()
571-
self.loop._stop_serving(sock)
572-
self.assertTrue(sock.close.called)
573-
self.proactor._stop_serving.assert_called_with(sock)
570+
sock1 = mock.Mock()
571+
future1 = mock.Mock()
572+
sock2 = mock.Mock()
573+
future2 = mock.Mock()
574+
self.loop._accept_futures = {
575+
sock1.fileno(): future1,
576+
sock2.fileno(): future2
577+
}
578+
579+
self.loop._stop_serving(sock1)
580+
self.assertTrue(sock1.close.called)
581+
self.assertTrue(future1.cancel.called)
582+
self.proactor._stop_serving.assert_called_with(sock1)
583+
self.assertFalse(sock2.close.called)
584+
self.assertFalse(future2.cancel.called)
574585

575586

576587
if __name__ == '__main__':
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix ``stop_serving`` in asyncio proactor loop kill all listening servers

0 commit comments

Comments
 (0)