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 10cb3760e8)
This commit is contained in:
Denis Ledoux 2018-10-26 17:15:22 +02:00 committed by Victor Stinner
parent 9dcb517f8e
commit 6f97a50c86
2 changed files with 6 additions and 0 deletions

View File

@ -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:

View File

@ -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.