summaryrefslogtreecommitdiffstats
path: root/nova/db
diff options
context:
space:
mode:
Diffstat (limited to 'nova/db')
-rw-r--r--nova/db/sqlalchemy/api.py37
1 files changed, 11 insertions, 26 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 1baa192a3..9efdc47f1 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -30,7 +30,6 @@ import uuid
from oslo.config import cfg
from sqlalchemy import and_
from sqlalchemy import Boolean
-from sqlalchemy import exc as sqla_exc
from sqlalchemy.exc import IntegrityError
from sqlalchemy.exc import NoSuchTableError
from sqlalchemy import Integer
@@ -52,6 +51,7 @@ import nova.context
from nova import db
from nova.db.sqlalchemy import models
from nova import exception
+from nova.openstack.common.db import exception as db_exc
from nova.openstack.common.db.sqlalchemy import session as db_session
from nova.openstack.common.db.sqlalchemy import utils as sqlalchemyutils
from nova.openstack.common import log as logging
@@ -143,30 +143,15 @@ def require_aggregate_exists(f):
def _retry_on_deadlock(f):
"""Decorator to retry a DB API call if Deadlock was received."""
- def _is_deadlock_exc(dberr_info):
- deadlock_str = 'Deadlock found when trying to get lock'
- try:
- if not isinstance(dberr_info, sqla_exc.OperationalError):
- return False
- if deadlock_str in dberr_info.message:
- LOG.warn(_("Deadlock detected when running "
- "'%(func_name)s': Retrying..."),
- dict(func_name=f.__name__))
- return True
- except Exception:
- pass
- return False
-
@functools.wraps(f)
def wrapped(*args, **kwargs):
while True:
try:
return f(*args, **kwargs)
- except db_session.DBError as db_err:
- exc_info = sys.exc_info()
- dberr_info = db_err.inner_exception
- if not _is_deadlock_exc(dberr_info):
- raise exc_info[0], exc_info[1], exc_info[2]
+ except db_exc.DBDeadlock:
+ LOG.warn(_("Deadlock detected when running "
+ "'%(func_name)s': Retrying..."),
+ dict(func_name=f.__name__))
# Retry!
time.sleep(0.5)
continue
@@ -1264,7 +1249,7 @@ def virtual_interface_create(context, values):
vif_ref = models.VirtualInterface()
vif_ref.update(values)
vif_ref.save()
- except db_session.DBError:
+ except db_exc.DBError:
raise exception.VirtualInterfaceCreateException()
return vif_ref
@@ -2079,7 +2064,7 @@ def network_create_safe(context, values):
try:
network_ref.save()
return network_ref
- except db_session.DBDuplicateEntry:
+ except db_exc.DBDuplicateEntry:
raise exception.DuplicateVlan(vlan=values['vlan'])
@@ -2321,7 +2306,7 @@ def network_update(context, network_id, values):
network_ref.update(values)
try:
network_ref.save(session=session)
- except db_session.DBDuplicateEntry:
+ except db_exc.DBDuplicateEntry:
raise exception.DuplicateVlan(vlan=values['vlan'])
return network_ref
@@ -3547,7 +3532,7 @@ def instance_type_create(context, values):
instance_type_ref.update(values)
instance_type_ref.save(session=session)
except Exception, e:
- raise db_session.DBError(e)
+ raise db_exc.DBError(e)
return _dict_with_extra_specs(instance_type_ref)
@@ -4209,7 +4194,7 @@ def s3_image_create(context, image_uuid):
s3_image_ref.update({'uuid': image_uuid})
s3_image_ref.save()
except Exception, e:
- raise db_session.DBError(e)
+ raise db_exc.DBError(e)
return s3_image_ref
@@ -4729,7 +4714,7 @@ def task_log_begin_task(context, task_name, period_beginning, period_ending,
task.task_items = task_items
try:
task.save()
- except db_session.DBDuplicateEntry:
+ except db_exc.DBDuplicateEntry:
raise exception.TaskAlreadyRunning(task_name=task_name, host=host)