Merge "db: Remove use of 'transaction' helper"
This commit is contained in:
commit
b36f4fbfca
|
@ -13,7 +13,6 @@
|
||||||
|
|
||||||
"""Implementation of SQLAlchemy backend."""
|
"""Implementation of SQLAlchemy backend."""
|
||||||
|
|
||||||
import contextlib
|
|
||||||
import datetime
|
import datetime
|
||||||
import functools
|
import functools
|
||||||
import itertools
|
import itertools
|
||||||
|
@ -113,22 +112,6 @@ def retry_on_db_error(func):
|
||||||
return try_func
|
return try_func
|
||||||
|
|
||||||
|
|
||||||
@contextlib.contextmanager
|
|
||||||
def transaction(context):
|
|
||||||
# https://docs.sqlalchemy.org/en/20/changelog/migration_20.html#session-subtransaction-behavior-removed
|
|
||||||
if not context.session.in_transaction():
|
|
||||||
with context.session.begin():
|
|
||||||
yield
|
|
||||||
else:
|
|
||||||
yield
|
|
||||||
|
|
||||||
|
|
||||||
def update_and_save(context, obj, values):
|
|
||||||
with transaction(context):
|
|
||||||
for k, v in values.items():
|
|
||||||
setattr(obj, k, v)
|
|
||||||
|
|
||||||
|
|
||||||
def _soft_delete(context, obj):
|
def _soft_delete(context, obj):
|
||||||
"""Mark this object as deleted."""
|
"""Mark this object as deleted."""
|
||||||
setattr(obj, 'deleted_at', timeutils.utcnow())
|
setattr(obj, 'deleted_at', timeutils.utcnow())
|
||||||
|
@ -178,7 +161,7 @@ def raw_template_update(context, template_id, values):
|
||||||
if getattr(raw_template_ref, k) != v)
|
if getattr(raw_template_ref, k) != v)
|
||||||
|
|
||||||
if values:
|
if values:
|
||||||
with transaction(context):
|
with context.session.begin():
|
||||||
for k, v in values.items():
|
for k, v in values.items():
|
||||||
setattr(raw_template_ref, k, v)
|
setattr(raw_template_ref, k, v)
|
||||||
|
|
||||||
|
@ -192,7 +175,7 @@ def raw_template_delete(context, template_id):
|
||||||
# Ignore not found
|
# Ignore not found
|
||||||
return
|
return
|
||||||
raw_tmpl_files_id = raw_template.files_id
|
raw_tmpl_files_id = raw_template.files_id
|
||||||
with transaction(context):
|
with context.session.begin():
|
||||||
context.session.delete(raw_template)
|
context.session.delete(raw_template)
|
||||||
if raw_tmpl_files_id is None:
|
if raw_tmpl_files_id is None:
|
||||||
return
|
return
|
||||||
|
@ -256,14 +239,16 @@ def resource_create_replacement(context,
|
||||||
with context.session.begin():
|
with context.session.begin():
|
||||||
new_res = _resource_create(context, new_res_values)
|
new_res = _resource_create(context, new_res_values)
|
||||||
update_data = {'replaced_by': new_res.id}
|
update_data = {'replaced_by': new_res.id}
|
||||||
if not _try_resource_update(context,
|
rows_updated = _resource_update(
|
||||||
existing_res_id, update_data,
|
context, existing_res_id, update_data, atomic_key,
|
||||||
atomic_key,
|
expected_engine_id=expected_engine_id,
|
||||||
expected_engine_id=expected_engine_id):
|
)
|
||||||
data = {}
|
|
||||||
if 'name' in new_res_values:
|
if not bool(rows_updated):
|
||||||
data['resource_name'] = new_res_values['name']
|
data = {}
|
||||||
raise exception.UpdateInProgress(**data)
|
if 'name' in new_res_values:
|
||||||
|
data['resource_name'] = new_res_values['name']
|
||||||
|
raise exception.UpdateInProgress(**data)
|
||||||
except db_exception.DBReferenceError as exc:
|
except db_exception.DBReferenceError as exc:
|
||||||
# New template_id no longer exists
|
# New template_id no longer exists
|
||||||
LOG.debug('Not creating replacement resource: %s', exc)
|
LOG.debug('Not creating replacement resource: %s', exc)
|
||||||
|
@ -425,30 +410,33 @@ def _add_atomic_key_to_values(values, atomic_key):
|
||||||
@retry_on_db_error
|
@retry_on_db_error
|
||||||
def resource_update(context, resource_id, values, atomic_key,
|
def resource_update(context, resource_id, values, atomic_key,
|
||||||
expected_engine_id=None):
|
expected_engine_id=None):
|
||||||
return _try_resource_update(context, resource_id, values, atomic_key,
|
with context.session.begin():
|
||||||
expected_engine_id)
|
return _resource_update(
|
||||||
|
context, resource_id, values, atomic_key,
|
||||||
|
expected_engine_id=expected_engine_id,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def _try_resource_update(context, resource_id, values, atomic_key,
|
def _resource_update(
|
||||||
expected_engine_id=None):
|
context, resource_id, values, atomic_key, expected_engine_id=None,
|
||||||
with transaction(context):
|
):
|
||||||
_add_atomic_key_to_values(values, atomic_key)
|
_add_atomic_key_to_values(values, atomic_key)
|
||||||
rows_updated = context.session.query(models.Resource).filter_by(
|
rows_updated = context.session.query(models.Resource).filter_by(
|
||||||
id=resource_id, engine_id=expected_engine_id,
|
id=resource_id, engine_id=expected_engine_id,
|
||||||
atomic_key=atomic_key).update(values)
|
atomic_key=atomic_key).update(values)
|
||||||
|
|
||||||
return bool(rows_updated)
|
return bool(rows_updated)
|
||||||
|
|
||||||
|
|
||||||
def resource_update_and_save(context, resource_id, values):
|
def resource_update_and_save(context, resource_id, values):
|
||||||
resource = context.session.get(models.Resource, resource_id)
|
resource = context.session.get(models.Resource, resource_id)
|
||||||
with transaction(context):
|
with context.session.begin():
|
||||||
for k, v in values.items():
|
for k, v in values.items():
|
||||||
setattr(resource, k, v)
|
setattr(resource, k, v)
|
||||||
|
|
||||||
|
|
||||||
def resource_delete(context, resource_id):
|
def resource_delete(context, resource_id):
|
||||||
with transaction(context):
|
with context.session.begin():
|
||||||
resource = context.session.get(models.Resource, resource_id)
|
resource = context.session.get(models.Resource, resource_id)
|
||||||
if resource:
|
if resource:
|
||||||
context.session.delete(resource)
|
context.session.delete(resource)
|
||||||
|
@ -870,7 +858,7 @@ def stack_create(context, values):
|
||||||
|
|
||||||
@retry_on_db_error
|
@retry_on_db_error
|
||||||
def stack_update(context, stack_id, values, exp_trvsl=None):
|
def stack_update(context, stack_id, values, exp_trvsl=None):
|
||||||
with transaction(context):
|
with context.session.begin():
|
||||||
query = (context.session.query(models.Stack)
|
query = (context.session.query(models.Stack)
|
||||||
.filter(and_(models.Stack.id == stack_id),
|
.filter(and_(models.Stack.id == stack_id),
|
||||||
(models.Stack.deleted_at.is_(None))))
|
(models.Stack.deleted_at.is_(None))))
|
||||||
|
@ -980,7 +968,7 @@ def stack_tags_set(context, stack_id, tags):
|
||||||
|
|
||||||
|
|
||||||
def stack_tags_delete(context, stack_id):
|
def stack_tags_delete(context, stack_id):
|
||||||
with transaction(context):
|
with context.session.begin():
|
||||||
return _stack_tags_delete(context, stack_id)
|
return _stack_tags_delete(context, stack_id)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1445,7 +1433,7 @@ def software_deployment_get_all(context, server_id=None):
|
||||||
def software_deployment_update(context, deployment_id, values):
|
def software_deployment_update(context, deployment_id, values):
|
||||||
deployment = _software_deployment_get(context, deployment_id)
|
deployment = _software_deployment_get(context, deployment_id)
|
||||||
try:
|
try:
|
||||||
with transaction(context):
|
with context.session.begin():
|
||||||
for k, v in values.items():
|
for k, v in values.items():
|
||||||
setattr(deployment, k, v)
|
setattr(deployment, k, v)
|
||||||
except db_exception.DBReferenceError:
|
except db_exception.DBReferenceError:
|
||||||
|
|
|
@ -2715,8 +2715,8 @@ class DBAPIResourceReplacementTest(common.HeatTestCase):
|
||||||
db_api.resource_update_and_save(other_ctx, orig.id,
|
db_api.resource_update_and_save(other_ctx, orig.id,
|
||||||
{'atomic_key': 2})
|
{'atomic_key': 2})
|
||||||
|
|
||||||
self.patchobject(db_api, '_try_resource_update',
|
self.patchobject(db_api, '_resource_update',
|
||||||
new=mock.Mock(wraps=db_api._try_resource_update,
|
new=mock.Mock(wraps=db_api._resource_update,
|
||||||
side_effect=update_atomic_key))
|
side_effect=update_atomic_key))
|
||||||
|
|
||||||
self.assertRaises(exception.UpdateInProgress,
|
self.assertRaises(exception.UpdateInProgress,
|
||||||
|
@ -2756,8 +2756,8 @@ class DBAPIResourceReplacementTest(common.HeatTestCase):
|
||||||
{'engine_id': 'a',
|
{'engine_id': 'a',
|
||||||
'atomic_key': 2})
|
'atomic_key': 2})
|
||||||
|
|
||||||
self.patchobject(db_api, '_try_resource_update',
|
self.patchobject(db_api, '_resource_update',
|
||||||
new=mock.Mock(wraps=db_api._try_resource_update,
|
new=mock.Mock(wraps=db_api._resource_update,
|
||||||
side_effect=lock_resource))
|
side_effect=lock_resource))
|
||||||
|
|
||||||
self.assertRaises(exception.UpdateInProgress,
|
self.assertRaises(exception.UpdateInProgress,
|
||||||
|
|
Loading…
Reference in New Issue