diff --git a/heat/engine/scheduler.py b/heat/engine/scheduler.py index dc22ee29ea..3b896811fa 100644 --- a/heat/engine/scheduler.py +++ b/heat/engine/scheduler.py @@ -427,7 +427,10 @@ class DependencyTaskGroup(object): def cancel_all(self, grace_period=None): for r in six.itervalues(self._runners): - r.cancel(grace_period=grace_period) + try: + r.cancel(grace_period=grace_period) + except Exception as ex: + LOG.debug('Exception cancelling task: %s' % six.text_type(ex)) def _cancel_recursively(self, key, runner): runner.cancel() diff --git a/heat/tests/engine/test_scheduler.py b/heat/tests/engine/test_scheduler.py index a0940198c6..4196e2c69b 100644 --- a/heat/tests/engine/test_scheduler.py +++ b/heat/tests/engine/test_scheduler.py @@ -280,6 +280,37 @@ class DependencyTaskGroupTest(common.HeatTestCase): run_tasks_with_exceptions, e1) self.assertEqual([e1], exc.exceptions) + def test_exceptions_on_cancel(self): + class TestException(Exception): + pass + + class ExceptionOnExit(Exception): + pass + + cancelled = [] + + def task_func(arg): + for i in range(4): + if i > 1: + raise TestException + + try: + yield + except GeneratorExit: + cancelled.append(arg) + raise ExceptionOnExit + + tasks = (('A', None), ('B', None), ('C', None)) + deps = dependencies.Dependencies(tasks) + + tg = scheduler.DependencyTaskGroup(deps, task_func) + task = tg() + + next(task) + next(task) + self.assertRaises(TestException, next, task) + self.assertEqual(len(tasks) - 1, len(cancelled)) + def test_exception_grace_period(self): e1 = Exception('e1')