Do not raise NEW exceptions

Raising NEW exception is bad practice, because we lose TraceBack.
So all places like:

except SomeException as e:
    raise e

should be replaced by

except SomeException:
    raise

If we are doing some other actions before reraising we should
store information about exception then do all actions and then
reraise it. This is caused by eventlet bug. It lost information
about exception if it switch threads.

fixes bug 1191730

Change-Id: Ia375ecef9f16bda65d5146d14ed4b37a988abb0c
This commit is contained in:
Boris Pavlovic 2013-06-14 17:53:53 +04:00
parent d147af21db
commit 616098dcd3
6 changed files with 41 additions and 30 deletions

View File

@ -134,11 +134,12 @@ class CoverageController(object):
# doesn't resolve to 127.0.0.1. Currently backdoors only open on # doesn't resolve to 127.0.0.1. Currently backdoors only open on
# loopback so this is for covering the common single host use case # loopback so this is for covering the common single host use case
except socket.error as e: except socket.error as e:
exc_info = sys.exc_info()
if 'ECONNREFUSED' in e and service['host'] == self.host: if 'ECONNREFUSED' in e and service['host'] == self.host:
service['telnet'] = telnetlib.Telnet('127.0.0.1', service['telnet'] = telnetlib.Telnet('127.0.0.1',
service['port']) service['port'])
else: else:
raise e raise exc_info[0], exc_info[1], exc_info[2]
self.services.append(service) self.services.append(service)
self._start_coverage_telnet(service['telnet'], service['service']) self._start_coverage_telnet(service['telnet'], service['service'])

View File

@ -25,6 +25,7 @@ SHOULD include dedicated exception logging.
""" """
import functools import functools
import sys
from oslo.config import cfg from oslo.config import cfg
import webob.exc import webob.exc
@ -127,7 +128,8 @@ class NovaException(Exception):
try: try:
message = self.message % kwargs message = self.message % kwargs
except Exception as e: except Exception:
exc_info = sys.exc_info()
# kwargs doesn't match a variable in the message # kwargs doesn't match a variable in the message
# log the issue and the kwargs # log the issue and the kwargs
LOG.exception(_('Exception in string format operation')) LOG.exception(_('Exception in string format operation'))
@ -135,7 +137,7 @@ class NovaException(Exception):
LOG.error("%s: %s" % (name, value)) LOG.error("%s: %s" % (name, value))
if CONF.fatal_exception_format_errors: if CONF.fatal_exception_format_errors:
raise e raise exc_info[0], exc_info[1], exc_info[2]
else: else:
# at least get the core message out if something happened # at least get the core message out if something happened
message = self.message message = self.message

View File

@ -17,6 +17,8 @@
# #
# @author: Aaron Rosen, Nicira Networks, Inc. # @author: Aaron Rosen, Nicira Networks, Inc.
import sys
from oslo.config import cfg from oslo.config import cfg
from quantumclient.common import exceptions as q_exc from quantumclient.common import exceptions as q_exc
from quantumclient.quantum import v2_0 as quantumv20 from quantumclient.quantum import v2_0 as quantumv20
@ -50,6 +52,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
security_group = quantum.create_security_group( security_group = quantum.create_security_group(
body).get('security_group') body).get('security_group')
except q_exc.QuantumClientException as e: except q_exc.QuantumClientException as e:
exc_info = sys.exc_info()
LOG.exception(_("Quantum Error creating security group %s"), LOG.exception(_("Quantum Error creating security group %s"),
name) name)
if e.status_code == 401: if e.status_code == 401:
@ -57,7 +60,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
# as this error code could be related to bad input or over # as this error code could be related to bad input or over
# quota # quota
raise exc.HTTPBadRequest() raise exc.HTTPBadRequest()
raise e raise exc_info[0], exc_info[1], exc_info[2]
return self._convert_to_nova_security_group_format(security_group) return self._convert_to_nova_security_group_format(security_group)
def update_security_group(self, context, security_group, def update_security_group(self, context, security_group,
@ -68,6 +71,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
security_group = quantum.update_security_group( security_group = quantum.update_security_group(
security_group['id'], body).get('security_group') security_group['id'], body).get('security_group')
except q_exc.QuantumClientException as e: except q_exc.QuantumClientException as e:
exc_info = sys.exc_info()
LOG.exception(_("Quantum Error updating security group %s"), LOG.exception(_("Quantum Error updating security group %s"),
name) name)
if e.status_code == 401: if e.status_code == 401:
@ -75,7 +79,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
# as this error code could be related to bad input or over # as this error code could be related to bad input or over
# quota # quota
raise exc.HTTPBadRequest() raise exc.HTTPBadRequest()
raise e raise exc_info[0], exc_info[1], exc_info[2]
return self._convert_to_nova_security_group_format(security_group) return self._convert_to_nova_security_group_format(security_group)
def _convert_to_nova_security_group_format(self, security_group): def _convert_to_nova_security_group_format(self, security_group):
@ -120,12 +124,13 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
quantum, 'security_group', name) quantum, 'security_group', name)
group = quantum.show_security_group(id).get('security_group') group = quantum.show_security_group(id).get('security_group')
except q_exc.QuantumClientException as e: except q_exc.QuantumClientException as e:
exc_info = sys.exc_info()
if e.status_code == 404: if e.status_code == 404:
LOG.debug(_("Quantum security group %s not found"), name) LOG.debug(_("Quantum security group %s not found"), name)
self.raise_not_found(e.message) self.raise_not_found(e.message)
else: else:
LOG.error(_("Quantum Error: %s"), e) LOG.error(_("Quantum Error: %s"), e)
raise e raise exc_info[0], exc_info[1], exc_info[2]
return self._convert_to_nova_security_group_format(group) return self._convert_to_nova_security_group_format(group)
@ -143,9 +148,9 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
try: try:
security_groups = quantum.list_security_groups(**search_opts).get( security_groups = quantum.list_security_groups(**search_opts).get(
'security_groups') 'security_groups')
except q_exc.QuantumClientException as e: except q_exc.QuantumClientException:
LOG.exception(_("Quantum Error getting security groups")) with excutils.save_and_reraise_exception():
raise e LOG.exception(_("Quantum Error getting security groups"))
converted_rules = [] converted_rules = []
for security_group in security_groups: for security_group in security_groups:
converted_rules.append( converted_rules.append(
@ -165,13 +170,14 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
try: try:
quantum.delete_security_group(security_group['id']) quantum.delete_security_group(security_group['id'])
except q_exc.QuantumClientException as e: except q_exc.QuantumClientException as e:
exc_info = sys.exc_info()
if e.status_code == 404: if e.status_code == 404:
self.raise_not_found(e.message) self.raise_not_found(e.message)
elif e.status_code == 409: elif e.status_code == 409:
self.raise_invalid_property(e.message) self.raise_invalid_property(e.message)
else: else:
LOG.error(_("Quantum Error: %s"), e) LOG.error(_("Quantum Error: %s"), e)
raise e raise exc_info[0], exc_info[1], exc_info[2]
def add_rules(self, context, id, name, vals): def add_rules(self, context, id, name, vals):
"""Add security group rule(s) to security group. """Add security group rule(s) to security group.
@ -188,13 +194,14 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
rules = quantum.create_security_group_rule( rules = quantum.create_security_group_rule(
body).get('security_group_rules') body).get('security_group_rules')
except q_exc.QuantumClientException as e: except q_exc.QuantumClientException as e:
exc_info = sys.exc_info()
if e.status_code == 409: if e.status_code == 409:
LOG.exception(_("Quantum Error getting security group %s"), LOG.exception(_("Quantum Error getting security group %s"),
name) name)
self.raise_not_found(e.message) self.raise_not_found(e.message)
else: else:
LOG.exception(_("Quantum Error:")) LOG.exception(_("Quantum Error:"))
raise e raise exc_info[0], exc_info[1], exc_info[2]
converted_rules = [] converted_rules = []
for rule in rules: for rule in rules:
converted_rules.append( converted_rules.append(
@ -246,9 +253,8 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
for rule_id in range(0, len(rule_ids)): for rule_id in range(0, len(rule_ids)):
quantum.delete_security_group_rule(rule_ids.pop()) quantum.delete_security_group_rule(rule_ids.pop())
except q_exc.QuantumClientException as e: except q_exc.QuantumClientException as e:
LOG.exception(_("Quantum Error unable to delete %s"), with excutils.save_and_reraise_exception():
rule_ids) LOG.exception(_("Quantum Error unable to delete %s"), rule_ids)
raise e
def get_rule(self, context, id): def get_rule(self, context, id):
quantum = quantumv2.get_client(context) quantum = quantumv2.get_client(context)
@ -256,12 +262,13 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
rule = quantum.show_security_group_rule( rule = quantum.show_security_group_rule(
id).get('security_group_rule') id).get('security_group_rule')
except q_exc.QuantumClientException as e: except q_exc.QuantumClientException as e:
exc_info = sys.exc_info()
if e.status_code == 404: if e.status_code == 404:
LOG.debug(_("Quantum security group rule %s not found"), id) LOG.debug(_("Quantum security group rule %s not found"), id)
self.raise_not_found(e.message) self.raise_not_found(e.message)
else: else:
LOG.error(_("Quantum Error: %s"), e) LOG.error(_("Quantum Error: %s"), e)
raise e raise exc_info[0], exc_info[1], exc_info[2]
return self._convert_to_nova_security_group_rule_format(rule) return self._convert_to_nova_security_group_rule_format(rule)
def get_instances_security_groups_bindings(self, context): def get_instances_security_groups_bindings(self, context):
@ -350,19 +357,20 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
security_group_id = quantumv20.find_resourceid_by_name_or_id( security_group_id = quantumv20.find_resourceid_by_name_or_id(
quantum, 'security_group', security_group_name) quantum, 'security_group', security_group_name)
except q_exc.QuantumClientException as e: except q_exc.QuantumClientException as e:
exc_info = sys.exc_info()
if e.status_code == 404: if e.status_code == 404:
msg = ("Security group %s is not found for project %s" % msg = ("Security group %s is not found for project %s" %
(security_group_name, context.project_id)) (security_group_name, context.project_id))
self.raise_not_found(msg) self.raise_not_found(msg)
else: else:
LOG.exception(_("Quantum Error:")) LOG.exception(_("Quantum Error:"))
raise e raise exc_info[0], exc_info[1], exc_info[2]
params = {'device_id': instance['uuid']} params = {'device_id': instance['uuid']}
try: try:
ports = quantum.list_ports(**params).get('ports') ports = quantum.list_ports(**params).get('ports')
except q_exc.QuantumClientException as e: except q_exc.QuantumClientException:
with excutils.save_and_reraise_exception():
LOG.exception(_("Quantum Error:")) LOG.exception(_("Quantum Error:"))
raise e
if not ports: if not ports:
msg = ("instance_id %s could not be found as device id on" msg = ("instance_id %s could not be found as device id on"
@ -398,19 +406,20 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
security_group_id = quantumv20.find_resourceid_by_name_or_id( security_group_id = quantumv20.find_resourceid_by_name_or_id(
quantum, 'security_group', security_group_name) quantum, 'security_group', security_group_name)
except q_exc.QuantumClientException as e: except q_exc.QuantumClientException as e:
exc_info = sys.exc_info()
if e.status_code == 404: if e.status_code == 404:
msg = ("Security group %s is not found for project %s" % msg = ("Security group %s is not found for project %s" %
(security_group_name, context.project_id)) (security_group_name, context.project_id))
self.raise_not_found(msg) self.raise_not_found(msg)
else: else:
LOG.exception(_("Quantum Error:")) LOG.exception(_("Quantum Error:"))
raise e raise exc_info[0], exc_info[1], exc_info[2]
params = {'device_id': instance['uuid']} params = {'device_id': instance['uuid']}
try: try:
ports = quantum.list_ports(**params).get('ports') ports = quantum.list_ports(**params).get('ports')
except q_exc.QuantumClientException as e: except q_exc.QuantumClientException:
with excutils.save_and_reraise_exception():
LOG.exception(_("Quantum Error:")) LOG.exception(_("Quantum Error:"))
raise e
if not ports: if not ports:
msg = ("instance_id %s could not be found as device id on" msg = ("instance_id %s could not be found as device id on"
@ -438,8 +447,8 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase):
quantum.update_port(port['id'], {'port': updated_port}) quantum.update_port(port['id'], {'port': updated_port})
found_security_group = True found_security_group = True
except Exception: except Exception:
LOG.exception(_("Quantum Error:")) with excutils.save_and_reraise_exception():
raise e LOG.exception(_("Quantum Error:"))
if not found_security_group: if not found_security_group:
msg = (_("Security group %(security_group_name)s not assocaited " msg = (_("Security group %(security_group_name)s not assocaited "
"with the instance %(instance)s"), "with the instance %(instance)s"),

View File

@ -212,5 +212,5 @@ def is_ipv6_supported():
if e.errno == errno.EAFNOSUPPORT: if e.errno == errno.EAFNOSUPPORT:
has_ipv6_support = False has_ipv6_support = False
else: else:
raise e raise
return has_ipv6_support return has_ipv6_support

View File

@ -402,8 +402,7 @@ def bm_interface_set_vif_uuid(context, if_id, vif_uuid):
if str(e).find('IntegrityError') != -1: if str(e).find('IntegrityError') != -1:
raise exception.NovaException(_("Baremetal interface %s " raise exception.NovaException(_("Baremetal interface %s "
"already in use") % vif_uuid) "already in use") % vif_uuid)
else: raise
raise e
@sqlalchemy_api.require_admin_context @sqlalchemy_api.require_admin_context

View File

@ -18,6 +18,7 @@ import os
import tempfile import tempfile
from nova import exception from nova import exception
from nova.openstack.common import excutils
from nova.openstack.common import log as logging from nova.openstack.common import log as logging
from nova import utils from nova import utils
from nova.virt.disk.mount import loop from nova.virt.disk.mount import loop
@ -77,10 +78,9 @@ class VFSLocalFS(vfs.VFS):
raise exception.NovaException(mount.error) raise exception.NovaException(mount.error)
self.mount = mount self.mount = mount
except Exception as e: except Exception as e:
LOG.debug(_("Failed to mount image %(ex)s)") % with excutils.save_and_reraise_exception():
{'ex': str(e)}) LOG.debug(_("Failed to mount image %(ex)s)"), {'ex': str(e)})
self.teardown() self.teardown()
raise e
def teardown(self): def teardown(self):
try: try: