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
This commit is contained in:
Zane Bitter 2015-11-04 18:10:55 -05:00
parent 2fd7367475
commit 03d9aebbc7

View File

@ -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.