From 2897634814c52aa2d6394ac6174cd418889eb722 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Wed, 30 Mar 2016 14:29:40 -0400 Subject: [PATCH] Avoid reference loops in DependencyTaskGroup Holding a reference to a traceback in a local variable can cause a reference loop (since the stack frame containing the local variable is inevitably referenced by the traceback), with the result that basically everything may need to get garbage collected. Prevent this by explicitly deleting the local variable holding the deletingtraceback once it is no longer required. Change-Id: Icde3dc0c6d5b2c799df778d3e1780514bc04bf5b --- heat/engine/scheduler.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/heat/engine/scheduler.py b/heat/engine/scheduler.py index 44b20c0a6d..7eb782eacf 100644 --- a/heat/engine/scheduler.py +++ b/heat/engine/scheduler.py @@ -401,11 +401,14 @@ class DependencyTaskGroup(object): self.cancel_all() if raised_exceptions: - 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) + try: + 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) + finally: + del raised_exceptions def cancel_all(self, grace_period=None): for r in six.itervalues(self._runners):