[Python-checkins] bpo-29711: Fix stop_serving in proactor loop kill all listening servers (#431)
Yury Selivanov
webhook-mailer at python.org
Tue Dec 19 07:23:20 EST 2017
https://github.com/python/cpython/commit/319c0345cdd8fddb49d235462e71883f1dd51b99
commit: 319c0345cdd8fddb49d235462e71883f1dd51b99
branch: master
author: Julien Duponchelle <julien at duponchelle.info>
committer: Yury Selivanov <yury at magic.io>
date: 2017-12-19T07:23:17-05:00
summary:
bpo-29711: Fix stop_serving in proactor loop kill all listening servers (#431)
files:
A Misc/NEWS.d/next/Library/2017-12-13-22-10-36.bpo-29711.hJjghA.rst
M Lib/asyncio/proactor_events.py
M Lib/test/test_asyncio/test_proactor_events.py
diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py
index 915ad1ae91c..7044437bbb1 100644
--- a/Lib/asyncio/proactor_events.py
+++ b/Lib/asyncio/proactor_events.py
@@ -536,6 +536,8 @@ def _stop_accept_futures(self):
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 47ebcad238c..82bff28d7d0 100644
--- a/Lib/test/test_asyncio/test_proactor_events.py
+++ b/Lib/test/test_asyncio/test_proactor_events.py
@@ -567,10 +567,21 @@ def test_create_server_cancel(self):
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 00000000000..6774172fb6b
--- /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
More information about the Python-checkins
mailing list