From d03891a4706dc3106f3d51074e0e6b14cbb8ca0c Mon Sep 17 00:00:00 2001 From: wong2 Date: Wed, 11 Mar 2015 20:46:44 +0800 Subject: [PATCH 1/4] reloader should survive SyntaxError --- gunicorn/util.py | 12 ++++++++++++ gunicorn/workers/base.py | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/gunicorn/util.py b/gunicorn/util.py index 13e6d65d..c8618b46 100644 --- a/gunicorn/util.py +++ b/gunicorn/util.py @@ -532,3 +532,15 @@ def warn(msg): print("!!!\n", file=sys.stderr) sys.stderr.flush() + + +def make_fail_app(msg): + + def app(environ, start_response): + start_response("500 Internal Server Error", [ + ("Content-Type", "text/plain"), + ("Content-Length", str(len(msg))) + ]) + return iter([msg]) + + return app diff --git a/gunicorn/workers/base.py b/gunicorn/workers/base.py index a82f6b85..58d0b5ea 100644 --- a/gunicorn/workers/base.py +++ b/gunicorn/workers/base.py @@ -8,6 +8,7 @@ import os import signal import sys import time +import traceback from random import randint @@ -116,7 +117,19 @@ class Worker(object): self.init_signals() - self.wsgi = self.app.wsgi() + try: + self.wsgi = self.app.wsgi() + except SyntaxError as e: + if not self.reloader: + raise + + self.log.exception(e) + + exc_type, exc_val, exc_tb = sys.exc_info() + self.reloader.add_extra_file(exc_val.filename) + + tb_string = traceback.format_exc(exc_tb) + self.wsgi = util.make_fail_app(tb_string) self.cfg.post_worker_init(self) From 250d98f48ac5d52e8cb34de09dacfbf47fd97cfd Mon Sep 17 00:00:00 2001 From: wong2 Date: Sat, 14 Mar 2015 23:28:24 +0800 Subject: [PATCH 2/4] fix for review --- gunicorn/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gunicorn/util.py b/gunicorn/util.py index c8618b46..efe5f3d8 100644 --- a/gunicorn/util.py +++ b/gunicorn/util.py @@ -541,6 +541,6 @@ def make_fail_app(msg): ("Content-Type", "text/plain"), ("Content-Length", str(len(msg))) ]) - return iter([msg]) + return [msg] return app From 1f8d3b6c37662357184f2043c7e2c74157fcdeff Mon Sep 17 00:00:00 2001 From: wong2 Date: Wed, 18 Mar 2015 18:52:54 +0800 Subject: [PATCH 3/4] use self.cfg.reload --- gunicorn/workers/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gunicorn/workers/base.py b/gunicorn/workers/base.py index 58d0b5ea..15329842 100644 --- a/gunicorn/workers/base.py +++ b/gunicorn/workers/base.py @@ -120,7 +120,7 @@ class Worker(object): try: self.wsgi = self.app.wsgi() except SyntaxError as e: - if not self.reloader: + if not self.cfg.reload: raise self.log.exception(e) From 81f65c28587f29edc087ecdf99a648770162e031 Mon Sep 17 00:00:00 2001 From: wong2 Date: Wed, 18 Mar 2015 19:18:15 +0800 Subject: [PATCH 4/4] extract to a method --- gunicorn/workers/base.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/gunicorn/workers/base.py b/gunicorn/workers/base.py index 15329842..0b8cc115 100644 --- a/gunicorn/workers/base.py +++ b/gunicorn/workers/base.py @@ -117,6 +117,15 @@ class Worker(object): self.init_signals() + self.cfg.post_worker_init(self) + + self.load_wsgi() + + # Enter main run loop + self.booted = True + self.run() + + def load_wsgi(self): try: self.wsgi = self.app.wsgi() except SyntaxError as e: @@ -131,12 +140,6 @@ class Worker(object): tb_string = traceback.format_exc(exc_tb) self.wsgi = util.make_fail_app(tb_string) - self.cfg.post_worker_init(self) - - # Enter main run loop - self.booted = True - self.run() - def init_signals(self): # reset signaling [signal.signal(s, signal.SIG_DFL) for s in self.SIGNALS]