mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
Fix graceful shutdown for gevent.
server.stop() are blocking worker and which is then may be killed by Arbiter.murder_workers() with timeout (not graceful_timeout). It's issues when graceful_timeout > timeout.
This commit is contained in:
parent
4d70a526f2
commit
b9bb3453c2
@ -8,6 +8,7 @@ from __future__ import with_statement
|
||||
import os
|
||||
import sys
|
||||
from datetime import datetime
|
||||
import time
|
||||
|
||||
# workaround on osx, disable kqueue
|
||||
if sys.platform == "darwin":
|
||||
@ -77,9 +78,21 @@ class GeventWorker(AsyncWorker):
|
||||
pass
|
||||
|
||||
try:
|
||||
# Try to stop connections until timeout
|
||||
self.notify()
|
||||
server.stop(timeout=self.cfg.graceful_timeout)
|
||||
# Stop accepting requests
|
||||
server.kill()
|
||||
|
||||
# Handle current requests until graceful_timeout
|
||||
ts = time.time()
|
||||
while time.time() - ts <= self.cfg.graceful_timeout:
|
||||
if server.pool.free_count() == server.pool.size:
|
||||
return # all requests was handled
|
||||
|
||||
self.notify()
|
||||
gevent.sleep(1.0)
|
||||
|
||||
# Force kill all active the handlers
|
||||
self.log.warning("Worker graceful timeout (pid:%s)" % self.pid)
|
||||
server.stop(timeout=1)
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user