Fix issues #2133 and #2244

Start reloader after loading the WSGI app.
This commit is contained in:
Stanis Trendelenburg 2020-02-02 22:57:14 +01:00
parent 73ae195068
commit 27d1e9887a
2 changed files with 71 additions and 2 deletions

View File

@ -117,8 +117,6 @@ class Worker(object):
self.init_signals()
self.load_wsgi()
# start the reloader
if self.cfg.reload:
def changed(fname):
@ -132,6 +130,9 @@ class Worker(object):
reloader_cls = reloader_engines[self.cfg.reload_engine]
self.reloader = reloader_cls(extra_files=self.cfg.reload_extra_files,
callback=changed)
self.load_wsgi()
if self.reloader:
self.reloader.start()
self.cfg.post_worker_init(self)

68
tests/test_reload.py Normal file
View File

@ -0,0 +1,68 @@
import unittest.mock as mock
from gunicorn.app.base import Application
from gunicorn.workers.base import Worker
from gunicorn.reloader import reloader_engines
class ReloadApp(Application):
def __init__(self):
super().__init__("no usage", prog="gunicorn_test")
def do_load_config(self):
self.load_default_config()
self.cfg.set('reload', True)
self.cfg.set('reload_engine', 'poll')
class SyntaxErrorApp(ReloadApp):
def wsgi(self):
error = SyntaxError('invalid syntax')
error.filename = 'syntax_error_filename'
raise error
class MyWorker(Worker):
def run(self):
pass
def test_reload_on_syntax_error():
"""
Test that reloading works if the application has a syntax error.
"""
reloader = mock.Mock()
reloader_engines['poll'] = lambda *args, **kw: reloader
app = SyntaxErrorApp()
cfg = app.cfg
log = mock.Mock()
worker = MyWorker(age=0, ppid=0, sockets=[], app=app, timeout=0, cfg=cfg, log=log)
worker.init_process()
reloader.start.assert_called_with()
reloader.add_extra_file.assert_called_with('syntax_error_filename')
def test_start_reloader_after_load_wsgi():
"""
Check that the reloader is started after the wsgi app has been loaded.
"""
reloader = mock.Mock()
reloader_engines['poll'] = lambda *args, **kw: reloader
app = ReloadApp()
cfg = app.cfg
log = mock.Mock()
worker = MyWorker(age=0, ppid=0, sockets=[], app=app, timeout=0, cfg=cfg, log=log)
worker.load_wsgi = mock.Mock()
mock_parent = mock.Mock()
mock_parent.attach_mock(worker.load_wsgi, 'load_wsgi')
mock_parent.attach_mock(reloader.start, 'reloader_start')
worker.init_process()
mock_parent.assert_has_calls([
mock.call.load_wsgi(),
mock.call.reloader_start(),
])