Merge "Raise the last exception thrown into DependencyTaskGroup"

This commit is contained in:
Jenkins 2016-07-20 14:17:24 +00:00 committed by Gerrit Code Review
commit ddf61d8bda
2 changed files with 33 additions and 3 deletions

View File

@ -419,6 +419,8 @@ class DependencyTaskGroup(object):
def __call__(self):
"""Return a co-routine which runs the task group."""
raised_exceptions = []
thrown_exceptions = []
while any(six.itervalues(self._runners)):
try:
for k, r in self._ready():
@ -427,7 +429,11 @@ class DependencyTaskGroup(object):
del self._graph[k]
if self._graph:
yield
try:
yield
except Exception:
thrown_exceptions.append(sys.exc_info())
raise
for k, r in self._running():
if r.step():
@ -439,6 +445,7 @@ class DependencyTaskGroup(object):
else:
self.cancel_all(grace_period=self.error_wait_time)
raised_exceptions.append(exc_info)
del exc_info
except: # noqa
with excutils.save_and_reraise_exception():
self.cancel_all()
@ -448,10 +455,13 @@ class DependencyTaskGroup(object):
if self.aggregate_exceptions:
raise ExceptionGroup(v for t, v, tb in raised_exceptions)
else:
exc_type, exc_val, traceback = raised_exceptions[0]
raise_(exc_type, exc_val, traceback)
if thrown_exceptions:
raise_(*thrown_exceptions[-1])
else:
raise_(*raised_exceptions[0])
finally:
del raised_exceptions
del thrown_exceptions
def cancel_all(self, grace_period=None):
if callable(grace_period):

View File

@ -371,6 +371,26 @@ class DependencyTaskGroupTest(common.HeatTestCase):
exc = self.assertRaises(type(e1), run_tasks_with_exceptions)
self.assertEqual(e1, exc)
def test_thrown_exception_order(self):
e1 = Exception('e1')
e2 = Exception('e2')
tasks = (('A', None), ('B', None), ('C', 'A'))
deps = dependencies.Dependencies(tasks)
tg = scheduler.DependencyTaskGroup(
deps, DummyTask(), reverse=self.reverse_order,
error_wait_time=1,
aggregate_exceptions=self.aggregate_exceptions)
task = tg()
next(task)
task.throw(e1)
next(task)
tg.error_wait_time = None
exc = self.assertRaises(type(e2), task.throw, e2)
self.assertIs(e2, exc)
class TaskTest(common.HeatTestCase):