summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorankitagrawal <ankit11.agrawal@nttdata.com>2014-10-07 07:36:10 -0700
committerAbhishek Kekane <abhishek.kekane@nttdata.com>2014-10-21 19:05:27 +0000
commit41e143b2172a36e4f49bc7e3a1ed97ee8477afb9 (patch)
treef75ff7dddf564975945caed53fc2cd424e75d84f
parente58013c2c0b6f0ffe57c2a70bd0b73f419f20bc9 (diff)
downloadglance-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.py2
-rw-r--r--glance/tests/unit/test_db.py10
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)