From 6f361f7da39c9567456d05523358aa6b65221798 Mon Sep 17 00:00:00 2001 From: Anant Patil Date: Thu, 5 May 2016 18:35:38 +0530 Subject: [PATCH] Fix DBDeadlock error in stack update Fix the DBDeadlock error encounter occasionally when stack is being updated in DB. Change-Id: I24a929d88d87c5c6d6b410ad990d8d027f4c5b1b Closes-Bug: #1578615 --- heat/db/sqlalchemy/api.py | 2 ++ heat/tests/db/test_sqlalchemy_api.py | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/heat/db/sqlalchemy/api.py b/heat/db/sqlalchemy/api.py index 773beac52c..1f537ee9bb 100644 --- a/heat/db/sqlalchemy/api.py +++ b/heat/db/sqlalchemy/api.py @@ -529,6 +529,8 @@ def stack_create(context, values): return stack_ref +@oslo_db_api.wrap_db_retry(max_retries=3, retry_on_deadlock=True, + retry_interval=0.5, inc_retry_interval=True) def stack_update(context, stack_id, values, exp_trvsl=None): stack = stack_get(context, stack_id) diff --git a/heat/tests/db/test_sqlalchemy_api.py b/heat/tests/db/test_sqlalchemy_api.py index 6ca151fcfc..4e03108932 100644 --- a/heat/tests/db/test_sqlalchemy_api.py +++ b/heat/tests/db/test_sqlalchemy_api.py @@ -1750,6 +1750,15 @@ class DBAPIStackTest(common.HeatTestCase): exp_trvsl=diff_uuid) self.assertFalse(updated) + @mock.patch.object(time, 'sleep') + def test_stack_update_retries_on_deadlock(self, sleep): + stack = create_stack(self.ctx, self.template, self.user_creds) + with mock.patch('sqlalchemy.orm.query.Query.update', + side_effect=db_exception.DBDeadlock) as mock_update: + self.assertRaises(db_exception.DBDeadlock, + db_api.stack_update, self.ctx, stack.id, {}) + self.assertEqual(4, mock_update.call_count) + def test_stack_set_status_release_lock(self): stack = create_stack(self.ctx, self.template, self.user_creds) values = {