designate/designate
Takahito Hirose 00d0cb71e6 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:29:22 +00:00
..
agent Auto-generate designate.conf.sample via genconfig testenv 2017-07-01 21:32:16 +07:00
api Remove v1 API 2018-01-11 14:13:43 +00:00
backend Resolve get_dns_view error after selecting multi-tenant view 2018-03-07 22:46:25 +00:00
central Fix DBDeadLock error resulting into 500 2019-04-08 02:29:22 +00:00
cmd Update deletion date for (zone|pool)-manager 2018-01-03 14:39:37 +00:00
common Fix policy name 2018-03-15 12:39:37 +00:00
hacking Fix typos in comments 2015-09-03 18:37:27 +09:00
locale/en_GB/LC_MESSAGES Imported Translations from Zanata 2018-03-01 07:12:22 +00:00
manage Check for multi level tlds 2017-10-17 17:36:55 +01:00
mdns Fix AXFR queries under py3.5 2017-07-24 16:31:36 +02:00
metrics_client Fix noop metrics timed decorator 2017-01-26 16:58:37 -07:00
network_api Auto-generate designate.conf.sample via genconfig testenv 2017-07-01 21:32:16 +07:00
notification_handler Remove deprecated cfg in notification and add format-v6 test 2017-07-17 06:21:50 +00:00
objects Remove v1 API 2018-01-11 14:13:43 +00:00
pool_manager Docs Refactor 2017-12-05 21:06:18 +00:00
producer Improving auto-genconfig for producer cfg 2017-07-31 19:22:27 +07:00
quota Auto-generate designate.conf.sample via genconfig testenv 2017-07-01 21:32:16 +07:00
resources Remove v1 API 2018-01-11 14:13:43 +00:00
scheduler Do not filter pools by attributes when non are provided 2018-05-02 17:35:07 +00:00
schema Remove v1 API 2018-01-11 14:13:43 +00:00
sink Auto-generate designate.conf.sample via genconfig testenv 2017-07-01 21:32:16 +07:00
sqlalchemy Fix DB migration with postgresql 2016-11-11 17:36:54 +01:00
storage PyMySQL 0.8.0 compat fix 2018-01-05 16:28:41 +00:00
tests Fix DBDeadLock error resulting into 500 2019-04-08 02:29:22 +00:00
worker Merge "Update deletion date for (zone|pool)-manager" 2018-01-04 17:17:07 +00:00
__init__.py Add sample_default for pybasedir in __init__.py 2018-03-07 22:28:40 +00:00
context.py Use oslo.context from_dict unmodified 2017-11-05 13:31:57 +11:00
coordination.py Docs Refactor 2017-12-05 21:06:18 +00:00
debug.py Update email addresses hp.com to hpe.com 2016-01-11 14:29:33 +00:00
dnsutils.py Auto-generate designate.conf.sample via genconfig testenv 2017-07-01 21:32:16 +07:00
exceptions.py Add support for getting Service Status 2016-04-12 16:32:17 +02:00
hookpoints.py Trivial fix pep8 and typos 2017-05-06 03:30:23 +07:00
i18n.py Update email addresses hp.com to hpe.com 2016-01-11 14:29:33 +00:00
loggingutils.py Add Decorator to log RPCAPI Calls 2016-04-21 14:11:35 +01:00
metrics.py Auto-generate designate.conf.sample via genconfig testenv 2017-07-01 21:32:16 +07:00
notifications.py Make notifications pluggable 2017-01-19 16:10:15 +00:00
opts.py Improving auto-genconfig for producer cfg 2017-07-31 19:22:27 +07:00
plugin.py Drop use of 'oslo' namespace package 2015-04-28 18:32:15 +00:00
policy.py Implement policy in code (1) 2017-10-24 09:23:25 +00:00
rpc.py Eliminate annoying oslo.messaging timed out message 2017-06-28 17:45:10 +00:00
service.py Fix servicing IPv6 based TCP connections 2017-11-23 17:55:59 +00:00
service_status.py Auto-generate designate.conf.sample via genconfig testenv 2017-07-01 21:32:16 +07:00
utils.py use oslo_utils.uuidutils module 2017-07-27 18:44:49 +05:30
version.py Switch to oslo.reports 2015-11-05 10:55:29 +01:00