[Python-checkins] bpo-35017, socketserver: don't accept request after shutdown (GH-9952)

Victor Stinner webhook-mailer at python.org
Fri Oct 26 09:46:20 EDT 2018


https://github.com/python/cpython/commit/10cb3760e8631a27f5db1e51b05494e29306c671
commit: 10cb3760e8631a27f5db1e51b05494e29306c671
branch: master
author: Denis Ledoux <be.ledoux.denis at gmail.com>
committer: Victor Stinner <vstinner at redhat.com>
date: 2018-10-26T15:46:17+02:00
summary:

bpo-35017, socketserver: don't accept request after shutdown (GH-9952)

Prior to this revision, after the shutdown of a `BaseServer`,
the server accepted a last single request
if it was sent between the server socket polling
and the polling timeout.

This can be problematic for instance for a server restart
for which you do not want to interrupt the service,
by not closing the listening socket during the restart.
One request failed because of this behavior.

Note that only one request failed,
following requests were not accepted, as expected.

files:
A Misc/NEWS.d/next/Library/2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst
M Lib/socketserver.py

diff --git a/Lib/socketserver.py b/Lib/socketserver.py
index 9dfd21bab9b6..f0377918e894 100644
--- a/Lib/socketserver.py
+++ b/Lib/socketserver.py
@@ -230,6 +230,9 @@ def serve_forever(self, poll_interval=0.5):
 
                 while not self.__shutdown_request:
                     ready = selector.select(poll_interval)
+                    # bpo-35017: shutdown() called during select(), exit immediately.
+                    if self.__shutdown_request:
+                        break
                     if ready:
                         self._handle_request_noblock()
 
diff --git a/Misc/NEWS.d/next/Library/2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst b/Misc/NEWS.d/next/Library/2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst
new file mode 100644
index 000000000000..5682717adf70
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst
@@ -0,0 +1,3 @@
+:meth:`socketserver.BaseServer.serve_forever` now exits immediately if it's
+:meth:`~socketserver.BaseServer.shutdown` method is called while it is
+polling for new events.



More information about the Python-checkins mailing list