From 33f7c96db62ee1e7ecade8cb0613cff1e58e6447 Mon Sep 17 00:00:00 2001 From: Randall Leeds Date: Tue, 6 Aug 2013 02:43:30 -0700 Subject: [PATCH] [ggevent] Stop quickly and cleanly on ppid change This change should improve interaction with reloaders and ensure that ports are not stuck open if the arbiter gets a hard kill signal or otherwise exits during any graceful or non-graceful shutdown. --- gunicorn/workers/ggevent.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/gunicorn/workers/ggevent.py b/gunicorn/workers/ggevent.py index 4d77526e..f792b917 100644 --- a/gunicorn/workers/ggevent.py +++ b/gunicorn/workers/ggevent.py @@ -50,6 +50,12 @@ class GeventWorker(AsyncWorker): monkey.noisy = False monkey.patch_all() + def notify(self): + super(GeventWorker, self).notify() + if self.ppid != os.getppid(): + self.log.info("Parent changed, shutting down: %s", self) + sys.exit(0) + def timeout_ctx(self): return gevent.Timeout(self.cfg.keepalive, False) @@ -75,19 +81,19 @@ class GeventWorker(AsyncWorker): server.start() servers.append(server) - pid = os.getpid() try: while self.alive: self.notify() - - if pid == os.getpid() and self.ppid != os.getppid(): - self.log.info("Parent changed, shutting down: %s", self) - break - gevent.sleep(1.0) except KeyboardInterrupt: pass + except: + try: + server.stop() + except: + pass + raise try: # Stop accepting requests @@ -119,6 +125,8 @@ class GeventWorker(AsyncWorker): super(GeventWorker, self).handle_request(*args) except gevent.GreenletExit: pass + except SystemExit: + pass if gevent.version_info[0] == 0: