summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Ledoux <be.ledoux.denis@gmail.com>2018-10-26 15:15:22 (GMT)
committerVictor Stinner <vstinner@redhat.com>2018-10-26 15:15:22 (GMT)
commit6f97a50c86737458c6bed9970c8dc31a465eff22 (patch)
tree2c407526f34ebde18f0e2c94a319c3da7fa1ff6d
parent9dcb517f8ebba16a46ec2a6a97bb3e4a97daeae9 (diff)
downloadcpython-6f97a50c86737458c6bed9970c8dc31a465eff22.zip
cpython-6f97a50c86737458c6bed9970c8dc31a465eff22.tar.gz
cpython-6f97a50c86737458c6bed9970c8dc31a465eff22.tar.bz2
bpo-35017, socketserver: don't accept request after shutdown (GH-9952) (GH-10129)
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. (cherry picked from commit 10cb3760e8631a27f5db1e51b05494e29306c671)
-rw-r--r--Lib/SocketServer.py3
-rw-r--r--Misc/NEWS.d/next/Library/2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst3
2 files changed, 6 insertions, 0 deletions
diff --git a/Lib/SocketServer.py b/Lib/SocketServer.py
index 122430e..df56830 100644
--- a/Lib/SocketServer.py
+++ b/Lib/SocketServer.py
@@ -229,6 +229,9 @@ class BaseServer:
# shutdown request and wastes cpu at all other times.
r, w, e = _eintr_retry(select.select, [self], [], [],
poll_interval)
+ # bpo-35017: shutdown() called during select(), exit immediately.
+ if self.__shutdown_request:
+ break
if self in r:
self._handle_request_noblock()
finally:
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 0000000..5682717
--- /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.