diff --git a/glance/db/sqlalchemy/api.py b/glance/db/sqlalchemy/api.py index 1f38f6d100..8d959d2f11 100644 --- a/glance/db/sqlalchemy/api.py +++ b/glance/db/sqlalchemy/api.py @@ -135,6 +135,8 @@ def image_update(context, image_id, values, purge_props=False, from_state=from_state) +@retry(retry_on_exception=_retry_on_deadlock, wait_fixed=500, + stop_max_attempt_number=50) def image_destroy(context, image_id): """Destroy the image or raise if it does not exist.""" session = get_session() diff --git a/glance/tests/unit/test_db.py b/glance/tests/unit/test_db.py index 57342ef6d5..835d20873a 100644 --- a/glance/tests/unit/test_db.py +++ b/glance/tests/unit/test_db.py @@ -717,3 +717,13 @@ class RetryOnDeadlockTestCase(test_utils.BaseTestCase): api._image_update(None, {}, 'fake-id') except TestException: self.assertEqual(sess.call_count, 3) + + # Test retry on image destroy if db deadlock occurs + self.attempts = 3 + with mock.patch.object(api, 'get_session') as sess: + sess.side_effect = _mock_get_session() + + try: + api.image_destroy(None, 'fake-id') + except TestException: + self.assertEqual(sess.call_count, 3)