From 567b4f6574593f3523ff822d757a63c81542a140 Mon Sep 17 00:00:00 2001 From: Kevin Gessner Date: Thu, 16 May 2013 11:13:12 -0400 Subject: [PATCH] eventlet: after reaching max_requests, wait up to the graceful_timeout for currently-running requests to complete. fixes #511 Requests that do not complete within the graceful timeout are killed. --- gunicorn/workers/geventlet.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gunicorn/workers/geventlet.py b/gunicorn/workers/geventlet.py index 995a0df0..93b1a4d4 100644 --- a/gunicorn/workers/geventlet.py +++ b/gunicorn/workers/geventlet.py @@ -40,6 +40,9 @@ class EventletWorker(AsyncWorker): super(EventletWorker, self).handle(listener, client, addr) + if not self.alive: + raise eventlet.StopServe() + def run(self): acceptors = [] for sock in self.sockets: @@ -60,5 +63,10 @@ class EventletWorker(AsyncWorker): eventlet.sleep(1.0) self.notify() - with eventlet.Timeout(self.cfg.graceful_timeout, False): - [eventlet.kill(a, eventlet.StopServe) for a in acceptors] + try: + with eventlet.Timeout(self.cfg.graceful_timeout) as t: + [a.wait() for a in acceptors] + except eventlet.Timeout as te: + if te != t: + raise + [a.kill() for a in acceptors]