Add retry for resource_purge_deleted call

Retry when resource_purge_deleted failed with deadlock or other exceptions.

Change-Id: Iadab7b45e653fc6f465e257d3f450c4eaf509297
Story: #2001997
Task: #19629
This commit is contained in:
ricolin 2018-05-10 17:02:55 +08:00
parent 0f1e2a0bc1
commit 566dd9301b
2 changed files with 15 additions and 0 deletions

View File

@ -234,6 +234,8 @@ def resource_get_all(context):
return results
@oslo_db_api.wrap_db_retry(max_retries=3, retry_on_deadlock=True,
retry_interval=0.5, inc_retry_interval=True)
def resource_purge_deleted(context, stack_id):
filters = {'stack_id': stack_id, 'action': 'DELETE', 'status': 'COMPLETE'}
query = context.session.query(models.Resource)

View File

@ -2516,6 +2516,19 @@ class DBAPIResourceTest(common.HeatTestCase):
self.assertRaises(exception.NotFound, db_api.resource_get,
self.ctx, resource.id)
@mock.patch.object(time, 'sleep')
def test_resource_purge_deleted_by_stack_retry_on_deadlock(self, m_sleep):
val = {'name': 'res1', 'action': rsrc.Resource.DELETE,
'status': rsrc.Resource.COMPLETE}
create_resource(self.ctx, self.stack, **val)
with mock.patch('sqlalchemy.orm.query.Query.delete',
side_effect=db_exception.DBDeadlock) as mock_delete:
self.assertRaises(db_exception.DBDeadlock,
db_api.resource_purge_deleted,
self.ctx, self.stack.id)
self.assertEqual(4, mock_delete.call_count)
def test_engine_get_all_locked_by_stack(self):
values = [
{'name': 'res1', 'action': rsrc.Resource.DELETE,