summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2019-05-08 18:34:42 +0000
committerGerrit Code Review <review@openstack.org>2019-05-08 18:34:42 +0000
commitb3f955b6a6e5afdd619f2071a42b07c991ccaa0a (patch)
tree0fdb4c29726055aa48d3c6bbdfb9e946e8bd7ff1
parent57af557693ca9890c0b289be943b34d3bdd78e49 (diff)
parent9b4b876d6ae3298110e15b6998306a2cf5660c3f (diff)
downloaddesignate-b3f955b6a6e5afdd619f2071a42b07c991ccaa0a.tar.gz
Merge "Fix DBDeadLock error resulting into 500" into stable/stein
-rw-r--r--designate/central/service.py2
-rw-r--r--designate/tests/unit/test_central/test_basic.py26
2 files changed, 27 insertions, 1 deletions
diff --git a/designate/central/service.py b/designate/central/service.py
index ffd12c65..f6f734d4 100644
--- a/designate/central/service.py
+++ b/designate/central/service.py
@@ -2317,8 +2317,8 @@ class Service(service.RPCService, service.Service):
"""
# TODO(kiall): If the status is SUCCESS and the zone is already ACTIVE,
# we likely don't need to do anything.
- self._update_record_status(context, zone_id, status, serial)
zone = self._update_zone_status(context, zone_id, status, serial)
+ self._update_record_status(context, zone_id, status, serial)
return zone
def _update_zone_status(self, context, zone_id, status, serial):
diff --git a/designate/tests/unit/test_central/test_basic.py b/designate/tests/unit/test_central/test_basic.py
index 5b882f4b..2d6db3ef 100644
--- a/designate/tests/unit/test_central/test_basic.py
+++ b/designate/tests/unit/test_central/test_basic.py
@@ -443,6 +443,32 @@ class CentralServiceTestCase(CentralBasic):
assert self.service._enforce_record_quota.called
assert self.service._update_zone_in_storage.called
+ def test_create_recordset_checking_DBDeadLock(self):
+ self.service._enforce_recordset_quota = mock.Mock()
+ self.service._enforce_record_quota = mock.Mock()
+ self.service._is_valid_recordset_name = mock.Mock()
+ self.service._is_valid_recordset_placement = mock.Mock()
+ self.service._is_valid_recordset_placement_subzone = mock.Mock()
+ self.service._is_valid_ttl = mock.Mock()
+
+ self.service.storage.create_recordset = mock.Mock(return_value='rs')
+ self.service._update_zone_in_storage = mock.Mock()
+
+ # NOTE(thirose): Since this is a race condition we assume that
+ # we will hit it if we try to do the operations in a loop 100 times.
+ for num in range(100):
+ recordset = Mock()
+ recordset.name = "b%s".format(num)
+ recordset.obj_attr_is_set.return_value = True
+ recordset.records = [MockRecord()]
+
+ rs, zone = self.service._create_recordset_in_storage(
+ self.context, Mockzone(), recordset
+ )
+ assert not self.service.storage._retry_on_deadlock.called
+ assert self.service._update_zone_in_storage.called
+ assert self.service.storage.create_recordset.called
+
def test__create_soa(self):
self.service._create_recordset_in_storage = Mock(
return_value=(None, None)