From 49562fba0898c244103ae46d8186ff1b56b9690b Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Fri, 26 Oct 2018 15:46:17 +0200 Subject: [PATCH] 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. (cherry picked from commit 10cb3760e8631a27f5db1e51b05494e29306c671) Co-authored-by: Denis Ledoux --- Lib/socketserver.py | 3 +++ .../next/Library/2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst diff --git a/Lib/socketserver.py b/Lib/socketserver.py index 9dfd21bab9b6f9..f0377918e89436 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 00000000000000..5682717adf70f9 --- /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.