]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
Do not raise NEW exceptions
authorSergey Vilgelm <svilgelm@mirantis.com>
Mon, 24 Jun 2013 11:19:50 +0000 (15:19 +0400)
committerSergey Vilgelm <svilgelm@mirantis.com>
Tue, 25 Jun 2013 13:25:07 +0000 (17:25 +0400)
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: Ic2be96e9f03d2ca46d060caf6f6f7f713a1d6b82

12 files changed:
HACKING.rst
cinder/exception.py
cinder/tests/test_netapp_nfs.py
cinder/tests/test_scality.py
cinder/tests/test_storwize_svc.py
cinder/transfer/api.py
cinder/volume/drivers/hds/hds.py
cinder/volume/drivers/netapp/iscsi.py
cinder/volume/drivers/netapp/nfs.py
cinder/volume/drivers/san/hp/hp_3par_common.py
cinder/volume/drivers/san/san.py
cinder/volume/drivers/scality.py

index f124e009533e8db725ef33b0ccf2d992b9019dc1..9d5e995e05cfc43805b9ce625ca6a4617411d1a3 100644 (file)
@@ -55,6 +55,15 @@ General
               {'vol_name': vol_name,
                'vol_size': vol_size}) # OKAY
 
+- Use 'raise' instead of 'raise e' to preserve original traceback or exception being reraised::
+
+    except Exception as e:
+        ...
+        raise e  # BAD
+
+    except Exception:
+        ...
+        raise  # OKAY
 
 Imports
 -------
index a028a5686ca641137abc6750b3900af85c548264..ccfc95c19c5247926866c86ca658f64fc2f6fe00 100644 (file)
@@ -24,6 +24,8 @@ SHOULD include dedicated exception logging.
 
 """
 
+import sys
+
 from oslo.config import cfg
 import webob.exc
 
@@ -105,17 +107,17 @@ class CinderException(Exception):
             try:
                 message = self.message % kwargs
 
-            except Exception as e:
+            except Exception:
+                exc_info = sys.exc_info()
                 # kwargs doesn't match a variable in the message
                 # log the issue and the kwargs
                 LOG.exception(_('Exception in string format operation'))
                 for name, value in kwargs.iteritems():
                     LOG.error("%s: %s" % (name, value))
                 if CONF.fatal_exception_format_errors:
-                    raise e
-                else:
-                    # at least get the core message out if something happened
-                    message = self.message
+                    raise exc_info[0], exc_info[1], exc_info[2]
+                # at least get the core message out if something happened
+                message = self.message
 
         super(CinderException, self).__init__(message)
 
index 5a4b16f9660dba3a1abfad56031ae04be34f1691..b087156f5d2eb9390b4d203b88368fc88187889f 100644 (file)
@@ -386,6 +386,6 @@ class NetappDirect7modeNfsDriverTestCase(NetappDirectCmodeNfsDriverTestCase):
             if isinstance(e, api.NaApiError):
                 pass
             else:
-                raise e
+                raise
 
         mox.VerifyAll()
index edaadd4807a3efec7bcd621a29fc42bc7e902463..77b1c4946f661822fb8b448678c9c09550cff807 100644 (file)
@@ -61,7 +61,7 @@ class ScalityDriverTestCase(test.TestCase):
             os.makedirs(path)
         except OSError as e:
             if e.errno != errno.EEXIST:
-                raise e
+                raise
 
     def _create_fake_config(self):
         open(self.TEST_CONFIG, "w+").close()
@@ -75,7 +75,7 @@ class ScalityDriverTestCase(test.TestCase):
             os.unlink(self.TEST_CONFIG)
         except OSError as e:
             if e.errno != errno.ENOENT:
-                raise e
+                raise
 
     def _configure_driver(self):
         scality.CONF.scality_sofs_config = self.TEST_CONFIG
index 04171739da3b07e8a3b916523727f7e47dbf71b9..ad083a4a2a2660d9316fefc94d7121d17c6b1fa4 100644 (file)
@@ -24,6 +24,7 @@
 Tests for the IBM Storwize family and SVC volume driver.
 """
 
+
 import random
 import re
 import socket
@@ -1610,7 +1611,7 @@ class StorwizeSVCDriverTestCase(test.TestCase):
                         self.assertEqual(attrs[k], v)
                 except exception.ProcessExecutionError as e:
                     if 'CMMVC7050E' not in e.stderr:
-                        raise e
+                        raise
 
     def test_storwize_svc_unicode_host_and_volume_names(self):
         # We'll check with iSCSI only - nothing protocol-dependednt here
index c8cd7cf870875ab94adec83857c84774afdb5d70..b89aa5990ee5bb5ff8fc5368f89e211258d7eeba 100644 (file)
@@ -27,6 +27,7 @@ from oslo.config import cfg
 
 from cinder.db import base
 from cinder import exception
+from cinder.openstack.common import excutils
 from cinder.openstack.common import log as logging
 from cinder import quota
 from cinder.volume import api as volume_api
@@ -192,12 +193,12 @@ class API(base.Base):
             if donor_reservations:
                 QUOTAS.commit(context, donor_reservations, project_id=donor_id)
             LOG.info(_("Volume %s has been transferred.") % volume_id)
-        except Exception as exc:
-            QUOTAS.rollback(context, reservations)
-            if donor_reservations:
-                QUOTAS.rollback(context, donor_reservations,
-                                project_id=donor_id)
-            raise exc
+        except Exception:
+            with excutils.save_and_reraise_exception():
+                QUOTAS.rollback(context, reservations)
+                if donor_reservations:
+                    QUOTAS.rollback(context, donor_reservations,
+                                    project_id=donor_id)
 
         vol_ref = self.db.volume_get(context, volume_id)
         return {'id': transfer_id,
index a85fd1c6d6668544db80f5baa2a5b62b210cea66..b023a43a847aa6321f3cad6bdb92cac3fbc22bfc 100644 (file)
@@ -24,6 +24,7 @@ from oslo.config import cfg
 from xml.etree import ElementTree as ETree
 
 from cinder import exception
+from cinder.openstack.common import excutils
 from cinder.openstack.common import log as logging
 from cinder import utils
 from cinder.volume import driver
@@ -86,8 +87,8 @@ def _xml_read(root, element, check=None):
         return None
     except ETree.ParseError as e:
         if check:
-            LOG.error(_("XML exception reading parameter: %s") % element)
-            raise e
+            with excutils.save_and_reraise_exception():
+                LOG.error(_("XML exception reading parameter: %s") % element)
         else:
             LOG.info(_("XML exception reading parameter: %s") % element)
             return None
index 17f9decb0200bd20aa9668aef10b20e97f06fe4a..a83e274a15d04e41ebc4fbe12e3e87f1d4b9cc44 100644 (file)
@@ -22,6 +22,7 @@ This driver requires NetApp Clustered Data ONTAP or 7-mode
 storage systems with installed iSCSI licenses.
 """
 
+import sys
 import time
 import uuid
 
@@ -402,12 +403,13 @@ class NetAppDirectISCSIDriver(driver.ISCSIDriver):
             message = e.message
             msg = _('Error mapping lun. Code :%(code)s, Message:%(message)s')
             msg_fmt = {'code': code, 'message': message}
+            exc_info = sys.exc_info()
             LOG.warn(msg % msg_fmt)
             (igroup, lun_id) = self._find_mapped_lun_igroup(path, initiator)
             if lun_id is not None:
                 return lun_id
             else:
-                raise e
+                raise exc_info[0], exc_info[1], exc_info[2]
 
     def _unmap_lun(self, path, initiator):
         """Unmaps a lun from given initiator."""
@@ -422,12 +424,13 @@ class NetAppDirectISCSIDriver(driver.ISCSIDriver):
             msg = _("Error unmapping lun. Code :%(code)s,"
                     " Message:%(message)s")
             msg_fmt = {'code': e.code, 'message': e.message}
+            exc_info = sys.exc_info()
             LOG.warn(msg % msg_fmt)
             # if the lun is already unmapped
             if e.code == '13115' or e.code == '9016':
                 pass
             else:
-                raise e
+                raise exc_info[0], exc_info[1], exc_info[2]
 
     def _find_mapped_lun_igroup(self, path, initiator, os=None):
         """Find the igroup for mapped lun with initiator."""
index 79b3edfbe27f32ecb22d5f4dbeb7fa48df470b98..c15787584bb0d7bfe0ae87f03c0ab6204769c2ce 100644 (file)
@@ -397,7 +397,7 @@ class NetAppDirect7modeNfsDriver (NetAppDirectNfsDriver):
             except NaApiError as e:
                 if e.code != 'UnknownCloneId':
                     self._clear_clone(clone_id)
-                raise e
+                raise
 
     def _get_actual_path_for_export(self, export_path):
         """Gets the actual path on the filer for export path."""
index 4c0ab2de46cdb11e6be4e9d298cab3457c3aebfe..919742e094a60e5ad7f28ee28195544bf77de8a6 100644 (file)
@@ -36,6 +36,8 @@ hp3par_api_url, hp3par_username, hp3par_password
 for credentials to talk to the REST service on the 3PAR
 array.
 """
+
+
 import base64
 import json
 import paramiko
@@ -52,10 +54,12 @@ from oslo.config import cfg
 
 from cinder import context
 from cinder import exception
+from cinder.openstack.common import excutils
 from cinder.openstack.common import log as logging
 from cinder import utils
 from cinder.volume import volume_types
 
+
 LOG = logging.getLogger(__name__)
 
 hp3par_opts = [
@@ -313,9 +317,9 @@ exit
                          "attempts : '%(command)s'") %
                        {'total_attempts': total_attempts, 'command': command})
                 raise paramiko.SSHException(msg)
-        except Exception as e:
-            LOG.error(_("Error running ssh command: %s") % command)
-            raise e
+        except Exception:
+            with excutils.save_and_reraise_exception():
+                LOG.error(_("Error running ssh command: %s") % command)
 
     def _delete_3par_host(self, hostname):
         self._cli_run('removehost %s' % hostname, None)
index 8d407c27ee2db093fce0b2fafbe91da781d0a5b5..09ea3e29b5c226cd8b11ba342401bf34575a8ae5 100644 (file)
@@ -27,6 +27,7 @@ from eventlet import greenthread
 from oslo.config import cfg
 
 from cinder import exception
+from cinder.openstack.common import excutils
 from cinder.openstack.common import log as logging
 from cinder import utils
 from cinder.volume.driver import ISCSIDriver
@@ -143,9 +144,9 @@ class SanISCSIDriver(ISCSIDriver):
                         stderr="Error running SSH command",
                         cmd=command)
 
-        except Exception as e:
-            LOG.error(_("Error running SSH command: %s") % command)
-            raise e
+        except Exception:
+            with excutils.save_and_reraise_exception():
+                LOG.error(_("Error running SSH command: %s") % command)
 
     def ensure_export(self, context, volume):
         """Synchronously recreates an export for a logical volume."""
index 0cad54ba0c4ecf6167486274a35236de290a834d..f75262346c346ea5262a0d1e30f103788c15ceaa 100644 (file)
@@ -16,6 +16,7 @@
 Scality SOFS Volume Driver.
 """
 
+
 import errno
 import os
 import urllib2
@@ -28,6 +29,7 @@ from cinder.image import image_utils
 from cinder.openstack.common import log as logging
 from cinder.volume import driver
 
+
 LOG = logging.getLogger(__name__)
 
 volume_opts = [
@@ -85,7 +87,7 @@ class ScalityDriver(driver.VolumeDriver):
             os.makedirs(path)
         except OSError as e:
             if e.errno != errno.EEXIST:
-                raise e
+                raise
 
     def _mount_sofs(self):
         config = CONF.scality_sofs_config