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:
parent
2fd7367475
commit
03d9aebbc7
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user