bpo-29711: Fix stop_serving in proactor loop kill all listening servers (#431)
authorJulien Duponchelle <julien@duponchelle.info>
Tue, 19 Dec 2017 12:23:17 +0000 (13:23 +0100)
committerYury Selivanov <yury@magic.io>
Tue, 19 Dec 2017 12:23:17 +0000 (07:23 -0500)
Lib/asyncio/proactor_events.py
Lib/test/test_asyncio/test_proactor_events.py
Misc/NEWS.d/next/Library/2017-12-13-22-10-36.bpo-29711.hJjghA.rst [new file with mode: 0644]

index 915ad1ae91c317b46ea343145d649ca27c70228c..7044437bbb1b4122ddedc005afb6f5467fe2d84a 100644 (file)
@@ -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()
index 47ebcad238c440a366df99c2fc25da09efd47cb5..82bff28d7d05933e9bd461406356270755918df3 100644 (file)
@@ -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 (file)
index 0000000..6774172
--- /dev/null
@@ -0,0 +1 @@
+Fix ``stop_serving`` in asyncio proactor loop kill all listening servers