diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-08-27 04:10:07 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-08-27 04:10:07 +0000 |
| commit | ffcb7129ec928788ce8266315f1de93c87d7d1ca (patch) | |
| tree | e2800336bee7edde2b99d9d1bc50effa98e2e907 /nova | |
| parent | 784282c28b69614082540c6a1342b1cfa6aac3f3 (diff) | |
| parent | 85b9ee6b5b74d15a6455cb6632578bea07d8eb11 (diff) | |
Merge "Make instance_update_and_get_original() atomic"
Diffstat (limited to 'nova')
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 63 |
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( |
