summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-08-27 04:10:07 +0000
committerGerrit Code Review <review@openstack.org>2012-08-27 04:10:07 +0000
commitffcb7129ec928788ce8266315f1de93c87d7d1ca (patch)
treee2800336bee7edde2b99d9d1bc50effa98e2e907
parent784282c28b69614082540c6a1342b1cfa6aac3f3 (diff)
parent85b9ee6b5b74d15a6455cb6632578bea07d8eb11 (diff)
Merge "Make instance_update_and_get_original() atomic"
-rw-r--r--nova/db/sqlalchemy/api.py63
1 files changed, 35 insertions, 28 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 913c5e04e..da1376c30 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -1756,29 +1756,30 @@ def instance_update_and_get_original(context, instance_uuid, values):
def _instance_update(context, instance_uuid, values, copy_old_instance=False):
session = get_session()
- if utils.is_uuid_like(instance_uuid):
+ if not utils.is_uuid_like(instance_uuid):
+ raise exception.InvalidUUID(instance_uuid)
+
+ with session.begin():
instance_ref = instance_get_by_uuid(context, instance_uuid,
session=session)
- else:
- raise exception.InvalidUUID(instance_uuid)
- if copy_old_instance:
- old_instance_ref = copy.copy(instance_ref)
- else:
- old_instance_ref = None
+ if copy_old_instance:
+ old_instance_ref = copy.copy(instance_ref)
+ else:
+ old_instance_ref = None
- metadata = values.get('metadata')
- if metadata is not None:
- instance_metadata_update(
- context, instance_ref['uuid'], values.pop('metadata'), delete=True)
+ metadata = values.get('metadata')
+ if metadata is not None:
+ instance_metadata_update(context, instance_ref['uuid'],
+ values.pop('metadata'), True,
+ session=session)
- system_metadata = values.get('system_metadata')
- if system_metadata is not None:
- instance_system_metadata_update(
- context, instance_ref['uuid'], values.pop('system_metadata'),
- delete=True)
+ system_metadata = values.get('system_metadata')
+ if system_metadata is not None:
+ instance_system_metadata_update(
+ context, instance_ref['uuid'], values.pop('system_metadata'),
+ delete=True, session=session)
- with session.begin():
instance_ref.update(values)
instance_ref.save(session=session)
@@ -3945,8 +3946,9 @@ def _instance_metadata_get_query(context, instance_uuid, session=None):
@require_context
-def instance_metadata_get(context, instance_uuid):
- rows = _instance_metadata_get_query(context, instance_uuid).all()
+def instance_metadata_get(context, instance_uuid, session=None):
+ rows = _instance_metadata_get_query(context, instance_uuid,
+ session=session).all()
result = {}
for row in rows:
@@ -3979,12 +3981,14 @@ def instance_metadata_get_item(context, instance_uuid, key, session=None):
@require_context
-def instance_metadata_update(context, instance_uuid, metadata, delete):
- session = get_session()
-
+def instance_metadata_update(context, instance_uuid, metadata, delete,
+ session=None):
+ if session is None:
+ session = get_session()
# Set existing metadata to deleted if delete argument is True
if delete:
- original_metadata = instance_metadata_get(context, instance_uuid)
+ original_metadata = instance_metadata_get(context, instance_uuid,
+ session=session)
for meta_key, meta_value in original_metadata.iteritems():
if meta_key not in metadata:
meta_ref = instance_metadata_get_item(context, instance_uuid,
@@ -4023,8 +4027,9 @@ def _instance_system_metadata_get_query(context, instance_uuid, session=None):
@require_context
-def instance_system_metadata_get(context, instance_uuid):
- rows = _instance_system_metadata_get_query(context, instance_uuid).all()
+def instance_system_metadata_get(context, instance_uuid, session=None):
+ rows = _instance_system_metadata_get_query(context, instance_uuid,
+ session=session).all()
result = {}
for row in rows:
@@ -4057,13 +4062,15 @@ def _instance_system_metadata_get_item(context, instance_uuid, key,
@require_context
-def instance_system_metadata_update(context, instance_uuid, metadata, delete):
- session = get_session()
+def instance_system_metadata_update(context, instance_uuid, metadata, delete,
+ session=None):
+ if session is None:
+ session = get_session()
# Set existing metadata to deleted if delete argument is True
if delete:
original_metadata = instance_system_metadata_get(
- context, instance_uuid)
+ context, instance_uuid, session=session)
for meta_key, meta_value in original_metadata.iteritems():
if meta_key not in metadata:
meta_ref = _instance_system_metadata_get_item(