summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--heat/db/sqlalchemy/api.py16
-rw-r--r--heat/tests/db/test_sqlalchemy_api.py8
2 files changed, 16 insertions, 8 deletions
diff --git a/heat/db/sqlalchemy/api.py b/heat/db/sqlalchemy/api.py
index 3966b0e3a..583e2cd78 100644
--- a/heat/db/sqlalchemy/api.py
+++ b/heat/db/sqlalchemy/api.py
@@ -260,6 +260,12 @@ def _add_atomic_key_to_values(values, atomic_key):
retry_interval=0.5, inc_retry_interval=True)
def resource_update(context, resource_id, values, atomic_key,
expected_engine_id=None):
+ return _try_resource_update(context, resource_id, values, atomic_key,
+ expected_engine_id)
+
+
+def _try_resource_update(context, resource_id, values, atomic_key,
+ expected_engine_id=None):
session = context.session
with session.begin(subtransactions=True):
_add_atomic_key_to_values(values, atomic_key)
@@ -448,6 +454,8 @@ def resource_create(context, values):
return resource_ref
+@oslo_db_api.wrap_db_retry(max_retries=3, retry_on_deadlock=True,
+ retry_interval=0.5, inc_retry_interval=True)
def resource_create_replacement(context,
existing_res_id, existing_res_values,
new_res_values,
@@ -458,10 +466,10 @@ def resource_create_replacement(context,
new_res = resource_create(context, new_res_values)
update_data = {'replaced_by': new_res.id}
update_data.update(existing_res_values)
- if not resource_update(context,
- existing_res_id, update_data,
- atomic_key,
- expected_engine_id=expected_engine_id):
+ if not _try_resource_update(context,
+ existing_res_id, update_data,
+ atomic_key,
+ expected_engine_id=expected_engine_id):
data = {}
if 'name' in new_res_values:
data['resource_name'] = new_res_values['name']
diff --git a/heat/tests/db/test_sqlalchemy_api.py b/heat/tests/db/test_sqlalchemy_api.py
index 096d3b88f..77821a7e2 100644
--- a/heat/tests/db/test_sqlalchemy_api.py
+++ b/heat/tests/db/test_sqlalchemy_api.py
@@ -2685,8 +2685,8 @@ class DBAPIResourceReplacementTest(common.HeatTestCase):
db_api.resource_update_and_save(other_ctx, orig.id,
{'atomic_key': 2})
- self.patchobject(db_api, 'resource_update',
- new=mock.Mock(wraps=db_api.resource_update,
+ self.patchobject(db_api, '_try_resource_update',
+ new=mock.Mock(wraps=db_api._try_resource_update,
side_effect=update_atomic_key))
self.assertRaises(exception.UpdateInProgress,
@@ -2728,8 +2728,8 @@ class DBAPIResourceReplacementTest(common.HeatTestCase):
{'engine_id': 'a',
'atomic_key': 2})
- self.patchobject(db_api, 'resource_update',
- new=mock.Mock(wraps=db_api.resource_update,
+ self.patchobject(db_api, '_try_resource_update',
+ new=mock.Mock(wraps=db_api._try_resource_update,
side_effect=lock_resource))
self.assertRaises(exception.UpdateInProgress,