diff options
author | Zuul <zuul@review.opendev.org> | 2019-06-17 20:16:00 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2019-06-17 20:16:00 +0000 |
commit | c7987ef4b74962ccdc50b5aad76b6ed973f7e70c (patch) | |
tree | f957821586ce5cee62f169b53eec9d03d416eb26 | |
parent | d26dbdfe09b6a669bac243809c2adfcea2e92be3 (diff) | |
parent | 00d0cb71e63e870fdf09833eec02f29b95542b18 (diff) | |
download | designate-c7987ef4b74962ccdc50b5aad76b6ed973f7e70c.tar.gz |
Merge "Fix DBDeadLock error resulting into 500" into stable/queens
-rw-r--r-- | designate/central/service.py | 2 | ||||
-rw-r--r-- | designate/tests/unit/test_central/test_basic.py | 26 |
2 files changed, 27 insertions, 1 deletions
diff --git a/designate/central/service.py b/designate/central/service.py index a51f3c0c..5d0b92d8 100644 --- a/designate/central/service.py +++ b/designate/central/service.py @@ -2313,8 +2313,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 a1e2e0bd..3e9f87d9 100644 --- a/designate/tests/unit/test_central/test_basic.py +++ b/designate/tests/unit/test_central/test_basic.py @@ -433,6 +433,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) |