diff --git a/lib/daemon.py b/lib/daemon.py index c843f0a0f06964b61d098043b2b259f3ea6925f4..06cd70c2c9aa51222b46498ffd311563cbd9e678 100644 --- a/lib/daemon.py +++ b/lib/daemon.py @@ -168,6 +168,7 @@ class Mainloop(object): @utils.SignalHandled([signal.SIGCHLD]) @utils.SignalHandled([signal.SIGTERM]) + @utils.SignalHandled([signal.SIGINT]) def Run(self, signal_handlers=None): """Runs the mainloop. @@ -194,7 +195,7 @@ class Mainloop(object): handler = signal_handlers[sig] if handler.called: self._CallSignalWaiters(sig) - running = (sig != signal.SIGTERM) + running = sig not in (signal.SIGTERM, signal.SIGINT) handler.Clear() def _CallSignalWaiters(self, signum): diff --git a/test/ganeti.daemon_unittest.py b/test/ganeti.daemon_unittest.py index ad5a12852904f2c68f7ae1f635afd833c4753a67..81912ee181af412eb3288b09010dc6191fd4c2b1 100755 --- a/test/ganeti.daemon_unittest.py +++ b/test/ganeti.daemon_unittest.py @@ -56,6 +56,16 @@ class TestMainloop(testutils.GanetiTestCase): self.mainloop.Run() # terminates by _SendSig being scheduled self.assertEquals(self.sendsig_events, [signal.SIGTERM]) + def testTerminatingSignals(self): + self.mainloop.scheduler.enter(0.1, 1, self._SendSig, [signal.SIGCHLD]) + self.mainloop.scheduler.enter(0.2, 1, self._SendSig, [signal.SIGINT]) + self.mainloop.Run() + self.assertEquals(self.sendsig_events, [signal.SIGCHLD, signal.SIGINT]) + self.mainloop.scheduler.enter(0.1, 1, self._SendSig, [signal.SIGTERM]) + self.mainloop.Run() + self.assertEquals(self.sendsig_events, [signal.SIGCHLD, signal.SIGINT, + signal.SIGTERM]) + def testSchedulerCancel(self): handle = self.mainloop.scheduler.enter(0.1, 1, self._SendSig, [signal.SIGTERM])