diff options
author | Russell Bryant <rbryant@redhat.com> | 2013-03-05 10:50:15 -0500 |
---|---|---|
committer | Russell Bryant <rbryant@redhat.com> | 2013-03-05 10:50:15 -0500 |
commit | f32af7b42e7801338583f67e794792f22df70a5d (patch) | |
tree | 6ec5aed6ed6ec4b7b4050a0d732f69cf5c335abc | |
parent | 2cb8e4557b05f92fbd9f56b7a6a6d4f35c8a883a (diff) | |
download | oslo-f32af7b42e7801338583f67e794792f22df70a5d.tar.gz oslo-f32af7b42e7801338583f67e794792f22df70a5d.tar.xz oslo-f32af7b42e7801338583f67e794792f22df70a5d.zip |
Preserve exceptions in impl_zmq.
There is complication with re-raising exceptions and our usage of
eventlet. If the code in the exception handler accesses the db or rpc
in the exception handler, it will no longer be able to re-raise the
exception. Using excutils.save_and_reraise_exception() works aorund
this issue.
The most common error is calling LOG.error() or LOG.exception(), as it
is possible for these to go access rpc. There is an option to turn on
notifications for these errors.
Fix bug 845866.
Change-Id: Ic914bba4703200ed114a42e3a55402883b430407
-rw-r--r-- | openstack/common/rpc/impl_zmq.py | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/openstack/common/rpc/impl_zmq.py b/openstack/common/rpc/impl_zmq.py index 13f5fca..b561f6d 100644 --- a/openstack/common/rpc/impl_zmq.py +++ b/openstack/common/rpc/impl_zmq.py @@ -25,6 +25,7 @@ import eventlet import greenlet from oslo.config import cfg +from openstack.common import excutils from openstack.common.gettextutils import _ from openstack.common import importutils from openstack.common import jsonutils @@ -91,8 +92,8 @@ def _serialize(data): try: return jsonutils.dumps(data, ensure_ascii=True) except TypeError: - LOG.error(_("JSON serialization failed.")) - raise + with excutils.save_and_reraise_exception(): + LOG.error(_("JSON serialization failed.")) def _deserialize(data): @@ -511,9 +512,9 @@ class ZmqProxy(ZmqBaseReactor): ipc_dir, run_as_root=True) utils.execute('chmod', '750', ipc_dir, run_as_root=True) except utils.ProcessExecutionError: - LOG.error(_("Could not create IPC directory %s") % - (ipc_dir, )) - raise + with excutils.save_and_reraise_exception(): + LOG.error(_("Could not create IPC directory %s") % + (ipc_dir, )) try: self.register(consumption_proxy, @@ -521,9 +522,9 @@ class ZmqProxy(ZmqBaseReactor): zmq.PULL, out_bind=True) except zmq.ZMQError: - LOG.error(_("Could not create ZeroMQ receiver daemon. " - "Socket may already be in use.")) - raise + with excutils.save_and_reraise_exception(): + LOG.error(_("Could not create ZeroMQ receiver daemon. " + "Socket may already be in use.")) super(ZmqProxy, self).consume_in_thread() |