From 4d06b7df0e23e81c0d357f1abeb07f6b4d4aa33e Mon Sep 17 00:00:00 2001 From: Mehdi Abaakouk Date: Tue, 27 Sep 2016 22:17:26 +0200 Subject: [PATCH] Don't use signal.alarm on python2 --- cotyledon/__init__.py | 10 ++++++++-- cotyledon/tests/test_cotyledon.py | 6 ------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cotyledon/__init__.py b/cotyledon/__init__.py index 982014b..755cf5e 100644 --- a/cotyledon/__init__.py +++ b/cotyledon/__init__.py @@ -147,7 +147,13 @@ class Service(object): def _terminate(self): signal.signal(signal.SIGTERM, signal.SIG_IGN) if self.graceful_shutdown_timeout > 0: - signal.alarm(self.graceful_shutdown_timeout) + # NOTE(sileht): signal.alarm doesn't work well on python2 + # use a threading timer instead + if sys.version_info[0] == 3: + signal.alarm(self.graceful_shutdown_timeout) + else: + threading.Timer(self.graceful_shutdown_timeout, + self._graceful_shutdown_timeout_cb).start() with _exit_on_exception(): self.terminate() sys.exit(0) @@ -157,7 +163,7 @@ class Service(object): 'graceful exiting of service %s' % self._title) self._terminate() - def _graceful_shutdown_timeout_cb(self, signum, frame): + def _graceful_shutdown_timeout_cb(self, *args, **kwargs): LOG.info('Graceful shutdown timeout (%d) exceeded, exiting %s now.' % (self.graceful_shutdown_timeout, self._title)) os._exit(1) diff --git a/cotyledon/tests/test_cotyledon.py b/cotyledon/tests/test_cotyledon.py index df8c9e4..52acb80 100644 --- a/cotyledon/tests/test_cotyledon.py +++ b/cotyledon/tests/test_cotyledon.py @@ -209,9 +209,6 @@ class TestCotyledon(Base): class TestBuggyCotyledon(Base): name = "buggy_app" - @unittest.skipIf(sys.version_info[0] != 3, - "Buggy on py27, time.sleep returns before alarm callback " - "is called") def test_graceful_timeout_term(self): lines = self.get_lines(1) childpid = self.get_pid(lines[0]) @@ -231,9 +228,6 @@ class TestBuggyCotyledon(Base): b'DEBUG:cotyledon:Shutdown finish' ], lines[-3:]) - @unittest.skipIf(sys.version_info[0] != 3, - "Buggy on py27, time.sleep returns before alarm callback " - "is called") def test_graceful_timeout_kill(self): lines = self.get_lines(1) childpid = self.get_pid(lines[0])