From 13aa4bceb4f9410870180756d446bc9ec3dafcec Mon Sep 17 00:00:00 2001 From: Mehdi Abaakouk Date: Wed, 6 Jul 2016 13:25:54 +0200 Subject: [PATCH] re-re-handles signal during service init This change remove usage of metaclass to do this. --- cotyledon/__init__.py | 62 ++++++++++++++++++++----------------------- requirements.txt | 1 - 2 files changed, 29 insertions(+), 34 deletions(-) diff --git a/cotyledon/__init__.py b/cotyledon/__init__.py index 317d228..e97af15 100644 --- a/cotyledon/__init__.py +++ b/cotyledon/__init__.py @@ -24,7 +24,6 @@ import threading import time import setproctitle -import six LOG = logging.getLogger(__name__) @@ -66,38 +65,6 @@ def _exit_on_exception(): _logged_sys_exit(2) -class ServiceMeta(type): - def __call__(cls, *args, **kwargs): - catched_signals = { - signal.SIGHUP: None, - signal.SIGTERM: None, - } - - def signal_delayer(sig, frame): - signal.signal(signal.SIGTERM, signal.SIG_IGN) - LOG.info('Caught signal (%s) during service initialisation, ' - 'delaying it' % sig) - catched_signals[sig] = frame - - # Setup temporary signals - signal.signal(signal.SIGHUP, signal_delayer) - signal.signal(signal.SIGTERM, signal_delayer) - - obj = type.__call__(cls, *args, **kwargs) - - # Setup final signals - if catched_signals[signal.SIGTERM] is not None: - obj._clean_exit(signal.SIGTERM, catched_signals[signal.SIGTERM]) - signal.signal(signal.SIGTERM, obj._clean_exit) - - if catched_signals[signal.SIGHUP] is not None: - obj._reload(signal.SIGHUP, catched_signals[signal.SIGHUP]) - signal.signal(signal.SIGHUP, obj._reload) - - return obj - - -@six.add_metaclass(ServiceMeta) class Service(object): """Base class for a service @@ -411,9 +378,38 @@ class ServiceManager(object): # Create and run a new service with _exit_on_exception(): + catched_signals = { + signal.SIGHUP: None, + signal.SIGTERM: None, + } + + def signal_delayer(sig, frame): + signal.signal(signal.SIGTERM, signal.SIG_IGN) + LOG.info('Caught signal (%s) during service initialisation, ' + 'delaying it' % sig) + catched_signals[sig] = frame + + # Setup temporary signals + signal.signal(signal.SIGHUP, signal_delayer) + signal.signal(signal.SIGTERM, signal_delayer) + + # Initialize the service process args = tuple() if config.args is None else config.args kwargs = dict() if config.kwargs is None else config.kwargs self._current_process = config.service(worker_id, *args, **kwargs) + + # Setup final signals + if catched_signals[signal.SIGTERM] is not None: + self._current_process._clean_exit( + signal.SIGTERM, catched_signals[signal.SIGTERM]) + signal.signal(signal.SIGTERM, self._current_process._clean_exit) + + if catched_signals[signal.SIGHUP] is not None: + self._current_process._reload( + signal.SIGHUP, catched_signals[signal.SIGHUP]) + signal.signal(signal.SIGHUP, self._current_process._reload) + + # Start the main thread _spawn(self._current_process._run) # Wait forever diff --git a/requirements.txt b/requirements.txt index f3e84b6..9910433 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,3 @@ pbr>=1.6 setproctitle -six