From: Julien Duponchelle Date: Tue, 19 Dec 2017 12:23:17 +0000 (+0100) Subject: bpo-29711: Fix stop_serving in proactor loop kill all listening servers (#431) X-Git-Tag: v3.7.0a4~94 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=319c0345cdd8fddb49d235462e71883f1dd51b99;p=python bpo-29711: Fix stop_serving in proactor loop kill all listening servers (#431) --- diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 915ad1ae91..7044437bbb 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -536,6 +536,8 @@ class BaseProactorEventLoop(base_events.BaseEventLoop): self._accept_futures.clear() def _stop_serving(self, sock): - self._stop_accept_futures() + future = self._accept_futures.pop(sock.fileno(), None) + if future: + future.cancel() self._proactor._stop_serving(sock) sock.close() diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py index 47ebcad238..82bff28d7d 100644 --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -567,10 +567,21 @@ class BaseProactorEventLoopTests(test_utils.TestCase): self.assertTrue(self.sock.close.called) def test_stop_serving(self): - sock = mock.Mock() - self.loop._stop_serving(sock) - self.assertTrue(sock.close.called) - self.proactor._stop_serving.assert_called_with(sock) + sock1 = mock.Mock() + future1 = mock.Mock() + sock2 = mock.Mock() + future2 = mock.Mock() + self.loop._accept_futures = { + sock1.fileno(): future1, + sock2.fileno(): future2 + } + + self.loop._stop_serving(sock1) + self.assertTrue(sock1.close.called) + self.assertTrue(future1.cancel.called) + self.proactor._stop_serving.assert_called_with(sock1) + self.assertFalse(sock2.close.called) + self.assertFalse(future2.cancel.called) if __name__ == '__main__': diff --git a/Misc/NEWS.d/next/Library/2017-12-13-22-10-36.bpo-29711.hJjghA.rst b/Misc/NEWS.d/next/Library/2017-12-13-22-10-36.bpo-29711.hJjghA.rst new file mode 100644 index 0000000000..6774172fb6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-12-13-22-10-36.bpo-29711.hJjghA.rst @@ -0,0 +1 @@ +Fix ``stop_serving`` in asyncio proactor loop kill all listening servers