]> granicus.if.org Git - python/commitdiff
bpo-35017, socketserver: don't accept request after shutdown (GH-9952)
authorDenis Ledoux <be.ledoux.denis@gmail.com>
Fri, 26 Oct 2018 13:46:17 +0000 (15:46 +0200)
committerVictor Stinner <vstinner@redhat.com>
Fri, 26 Oct 2018 13:46:17 +0000 (15:46 +0200)
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.

Lib/socketserver.py
Misc/NEWS.d/next/Library/2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst [new file with mode: 0644]

index 9dfd21bab9b6f9f25410ef0b3fa1e6c11bcec303..f0377918e894365aa15be6efd891c1a21c584ad0 100644 (file)
@@ -230,6 +230,9 @@ class BaseServer:
 
                 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 (file)
index 0000000..5682717
--- /dev/null
@@ -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.