diff options
author | ankitagrawal <ankit11.agrawal@nttdata.com> | 2014-10-07 07:36:10 -0700 |
---|---|---|
committer | Abhishek Kekane <abhishek.kekane@nttdata.com> | 2014-10-21 19:05:27 +0000 |
commit | 41e143b2172a36e4f49bc7e3a1ed97ee8477afb9 (patch) | |
tree | f75ff7dddf564975945caed53fc2cd424e75d84f | |
parent | e58013c2c0b6f0ffe57c2a70bd0b73f419f20bc9 (diff) | |
download | glance-41e143b2172a36e4f49bc7e3a1ed97ee8477afb9.tar.gz |
Can not delete images if db deadlock occurs
Glance api returns 500 Internal Server Error, if db deadlock occurs
in glance-registry for some reason while deleting an image.
Added retry on image_destroy when db deadlock occures which will again
try to delete the image from database.
Closes-bug: 1378215
Change-Id: Ifad403e363daf368e846b5b6838432a7bedbe81a
(cherry picked from commit dae0fa8f1071be41d5541e9a5254abea48f5ba36)
-rw-r--r-- | glance/db/sqlalchemy/api.py | 2 | ||||
-rw-r--r-- | glance/tests/unit/test_db.py | 10 |
2 files changed, 12 insertions, 0 deletions
diff --git a/glance/db/sqlalchemy/api.py b/glance/db/sqlalchemy/api.py index 1f38f6d10..8d959d2f1 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 57342ef6d..835d20873 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) |