designate/designate/tests
Takahito Hirose 9b4b876d6a Fix DBDeadLock error resulting into 500
When user requests the record registration request continuously,
sometimes designate hits DBDeadLock resuting into 500 InternalServerError.

We get below error:

2019-02-21 21:30:39.925 49752 ERROR designate.api.middleware RemoteError:
Remote error: DBDeadlock (pymysql.err.InternalError)
(1213, u'Deadlock found when trying to get lock; try restarting transaction')
[SQL: u'UPDATE records SET version=(records.version + %(version_1)s),
updated_at=%(updated_at)s, data=%(data)s, hash=%(hash)s, status=%(status)s,
action=%(action)s, serial=%(serial)s WHERE records.id = %(id_1)s']
[parameters: {'status': 'PENDING', 'hash': '39795ee18c6e3c9ad1c0190c6a3d8d4f',
'updated_at': datetime.datetime(2019, 2, 21, 12, 30, 39, 909846), u'version_1': 1,
u'id_1': '7a655eeda4d446cdaa81caf19ab55fcc', 'action': 'UPDATE',
'serial': 1550752338,
'data': u'ns2.example.jp. domain.example.com. 1550752338 3552 600 86400 3600'}]

In the process of record registeration, designate first tried to update
the reocrd and then update the zone status.

Updating the zone_status and registering the record process[1] and after synced
update record_status and zone_status process[2] are in reverse order. So If user
request the registering record many time and same time, Designate will get the
DBDeadLock, when these processes run the same time.

We observed that changing the order of the operations solves this issue.

[1] https://github.com/openstack/designate/blob/master/designate/central/service.py#L1292-L1320
[2] https://github.com/openstack/designate/blob/master/designate/central/service.py#L2310-L2322

1. transaction [1]-1 updating zone status process <- run    ---> table_name-zone
2. transaction [2]-1 updating record status process <- run  ---> table_name-record
3. transaction [1]-2 registering record process <- run and wait  ---> table_name-record
4. transaction [2]-2 updating zone process <-deadlock!           ---> table_name-zone

Change-Id: Icd6e690ac84a2fe0db0f4a8a513de47f7916f5ea
Related-Bug: #1785459
(cherry picked from commit f828654a3d)
2019-04-08 02:27:17 +00:00
..
resources Fix test failures for new dnspython module 2018-12-14 13:56:29 +00:00
test_agent Remove usage of parameter enforce_type 2017-05-22 22:45:14 +08:00
test_api Merge "Keep NS records for subdomains during Zone import." 2018-03-05 04:04:40 +00:00
test_backend Use oslo_serialization instead of the json module directly 2019-01-18 14:22:04 -08:00
test_central CAA DNS records 2018-11-07 16:08:01 +00:00
test_mdns Unskip and fix handler tests in py3 2017-05-23 14:47:22 +02:00
test_network_api Update email addresses hp.com to hpe.com 2016-01-11 14:29:33 +00:00
test_notification_handler Use oslo_serialization instead of the json module directly 2019-01-18 14:22:04 -08:00
test_objects CAA DNS records 2018-11-07 16:08:01 +00:00
test_pool_manager Make unit-testing more robust 2019-02-19 23:40:08 -08:00
test_producer Make unit-testing more robust 2019-02-19 23:40:08 -08:00
test_quota Update email addresses hp.com to hpe.com 2016-01-11 14:29:33 +00:00
test_resources Remove unused V2 schemas 2015-07-21 12:04:07 +01:00
test_schema Remove v1 API 2018-01-11 14:13:43 +00:00
test_storage Add unique constraint to service_statuses 2018-05-20 12:41:21 -07:00
test_workers Merge "Worker should send NOTIFY also to all servers in 'also_notifies' pool settings." 2018-10-15 18:55:44 +00:00
unit Fix DBDeadLock error resulting into 500 2019-04-08 02:27:17 +00:00
__init__.py Merge "Switch to oslo_messaging.ConfFixture.transport_url" 2018-06-14 17:29:45 +00:00
fixtures.py Remove translation of log messages 2018-03-14 12:54:05 -07:00
test_context.py Restrict editing of managed records to policy based ACL 2015-04-09 11:39:51 +01:00
test_coordination.py Merge "Retry Coordinator start indefinitely" 2016-01-14 15:19:09 +00:00
test_dnsutils.py Fix test failures for new dnspython module 2018-12-14 13:56:29 +00:00
test_hookpoints.py Use six.iterkeys(x) instead of x.keys() 2015-07-01 00:18:40 +05:30
test_sqlalchemy.py Update email addresses hp.com to hpe.com 2016-01-11 14:29:33 +00:00
test_utils.py Remove v1 API 2018-01-11 14:13:43 +00:00