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:
Konstantin Kapustin 2012-07-25 17:26:52 +04:00
parent 4d70a526f2
commit b9bb3453c2

View File

@ -8,6 +8,7 @@ from __future__ import with_statement
import os import os
import sys import sys
from datetime import datetime from datetime import datetime
import time
# workaround on osx, disable kqueue # workaround on osx, disable kqueue
if sys.platform == "darwin": if sys.platform == "darwin":
@ -77,9 +78,21 @@ class GeventWorker(AsyncWorker):
pass pass
try: try:
# Try to stop connections until timeout # Stop accepting requests
self.notify() server.kill()
server.stop(timeout=self.cfg.graceful_timeout)
# 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: except:
pass pass