From 4633d1aad9ffab87d7fc234c5b55de49b7e9d948 Mon Sep 17 00:00:00 2001 From: Randall Leeds Date: Thu, 15 Sep 2011 16:17:20 -0700 Subject: [PATCH] keep graceful shutdown from interrupting workers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the signal.siginterrupt call is available it can be used to make interrupted system calls (errno == EINTR) retry transparently whenever they have not caused any side effects yet (e.g. no data read/written). It should make shutdown more graceful. Patch by Jonas Borgström --- THANKS | 1 + gunicorn/workers/base.py | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/THANKS b/THANKS index f2e4366d..10585cbd 100644 --- a/THANKS +++ b/THANKS @@ -33,3 +33,4 @@ Masahiro Nakagawa Denis Bilenko Phil Schanely Chris Lamb +Jonas Borgström diff --git a/gunicorn/workers/base.py b/gunicorn/workers/base.py index b9a511b4..5616c837 100644 --- a/gunicorn/workers/base.py +++ b/gunicorn/workers/base.py @@ -110,6 +110,11 @@ class Worker(object): signal.signal(signal.SIGINT, self.handle_exit) signal.signal(signal.SIGWINCH, self.handle_winch) signal.signal(signal.SIGUSR1, self.handle_usr1) + # Don't let SIGQUIT and SIGUSR1 disturb active requests + # by interrupting system calls + if hasattr(signal, 'siginterrupt'): # python >= 2.6 + signal.siginterrupt(signal.SIGQUIT, False) + signal.siginterrupt(signal.SIGUSR1, False) def handle_usr1(self, sig, frame): self.log.reopen_files()