From 03d9aebbc7d5fba048fa9f39813704e70dee9c5d Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Wed, 4 Nov 2015 18:10:55 -0500 Subject: [PATCH] Log an error on an uncaught exception in a thread Exceptions in synchronous tasks get caught by the olso_messaging code but for asynchronous tasks run in threads with nothing wait()ing for them, there is no top level error handling, and hence no logging. (Tracebacks would be written to stderr, so systemd users would see them only in the journal rather than heat-engine.log, and other users would quite likely lose them altogether.) This change ensures that any uncaught exceptions are logged as errors. Change-Id: I9410aa7ffd83391ea4db13c6e8cf49f26d3049fb Closes-Bug: #1492427 --- heat/engine/service.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/heat/engine/service.py b/heat/engine/service.py index 89abce6289..1bbdfe3044 100644 --- a/heat/engine/service.py +++ b/heat/engine/service.py @@ -120,9 +120,20 @@ class ThreadGroupManager(object): """Run the given method in a sub-thread.""" if stack_id not in self.groups: self.groups[stack_id] = threadgroup.ThreadGroup() - return self.groups[stack_id].add_thread(self._start_with_trace, - self._serialize_profile_info(), - func, *args, **kwargs) + + def log_exceptions(gt): + try: + gt.wait() + except Exception: + LOG.exception(_LE('Unhandled error in asynchronous task')) + except BaseException: + pass + + th = self.groups[stack_id].add_thread(self._start_with_trace, + self._serialize_profile_info(), + func, *args, **kwargs) + th.link(log_exceptions) + return th def start_with_lock(self, cnxt, stack, engine_id, func, *args, **kwargs): """Run the method in sub-thread if acquire a stack lock is successful.