Skip to content

Commit 8f11cb3

Browse files
bpo-29711: Fix stop_serving in proactor loop kill all listening servers
1 parent 02e4b7f commit 8f11cb3

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

Lib/asyncio/proactor_events.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,8 @@ def _stop_accept_futures(self):
537537
self._accept_futures.clear()
538538

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

Lib/test/test_asyncio/test_proactor_events.py

+15-4
Original file line numberDiff line numberDiff line change
@@ -557,10 +557,21 @@ def test_create_server_cancel(self):
557557
self.assertTrue(self.sock.close.called)
558558

559559
def test_stop_serving(self):
560-
sock = mock.Mock()
561-
self.loop._stop_serving(sock)
562-
self.assertTrue(sock.close.called)
563-
self.proactor._stop_serving.assert_called_with(sock)
560+
sock1 = mock.Mock()
561+
future1 = mock.Mock()
562+
sock2 = mock.Mock()
563+
future2 = mock.Mock()
564+
self.loop._accept_futures = {
565+
sock1.fileno(): future1,
566+
sock2.fileno(): future2
567+
}
568+
569+
self.loop._stop_serving(sock1)
570+
self.assertTrue(sock1.close.called)
571+
self.assertTrue(future1.cancel.called)
572+
self.proactor._stop_serving.assert_called_with(sock1)
573+
self.assertFalse(sock2.close.called)
574+
self.assertFalse(future2.cancel.called)
564575

565576

566577
if __name__ == '__main__':
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)