Always delete exc_info tuple, even if reply fails

Avoid any possible references to exc_info tuple by ensuring
we delete it in a finally block, so that even if replying or
logging fails somehow the prior exception is always deleted
correctly.

Change-Id: Id0e5099b9b38b1803bb4514f7cf3deae760d5ac3
This commit is contained in:
Joshua Harlow 2016-03-04 11:52:34 -08:00
parent 5b75f39676
commit 0774b5ceba

View File

@ -145,13 +145,15 @@ class RPCDispatcher(dispatcher.DispatcherBase):
# by another exception raise by a log handler during
# LOG.exception(). So keep a copy and delete it later.
exc_info = sys.exc_info()
LOG.error(_LE('Exception during message handling: %s'), e,
exc_info=exc_info)
incoming.reply(failure=exc_info)
# NOTE(dhellmann): Remove circular object reference
# between the current stack frame and the traceback in
# exc_info.
del exc_info
try:
LOG.error(_LE('Exception during message handling: %s'), e,
exc_info=exc_info)
incoming.reply(failure=exc_info)
finally:
# NOTE(dhellmann): Remove circular object reference
# between the current stack frame and the traceback in
# exc_info.
del exc_info
def _dispatch(self, ctxt, message):
"""Dispatch an RPC message to the appropriate endpoint method.