Description
References: T167942 and cc0473766a53. I was advised to report this as a bug.
Every now and then (700+ occurrences over a single day with a moderately busy instance) PostgreSQL registers a deadlock, always with queries related to the module_deps table:
Apr 27 18:00:00 db newsyslog[60636]: logfile turned over due to size>1000K Apr 27 18:00:00 db postgres[60412]: [8-1] azurlane_wiki ERROR: deadlock detected Apr 27 18:00:00 db postgres[60412]: [8-2] azurlane_wiki DETAIL: Process 60412 waits for ShareLock on transaction 31624948; blocked by process 60420. Apr 27 18:00:00 db postgres[60412]: [8-3] Process 60420 waits for ShareLock on transaction 31624945; blocked by process 60412. Apr 27 18:00:00 db postgres[60412]: [8-4] Process 60412: UPDATE /* Wikimedia\Rdbms\Database::upsert */ "module_deps" SET md_deps = '["resources/src/jquery/jquery.makeCollapsible.styles.less"]' WHERE ((md_module = 'jquery.makeCollapsible.styles') OR (md_skin = 'vector|en-gb')) Apr 27 18:00:00 db postgres[60412]: [8-5] Process 60420: UPDATE /* Wikimedia\Rdbms\Database::upsert */ "module_deps" SET md_deps = '["extensions/MobileFrontend/mobile.less/mobile.mixins.less","extensions/MobileFrontend/mobile.less/mobile.variables.less","extensions/MobileFrontend/resources/mobile.startup/LoadingOverlay.less","extensions/MobileFrontend/resources/mobile.startup/Overlay.less","extensions/MobileFrontend/resources/mobile.startup/drawer.less","extensions/MobileFrontend/resources/mobile.startup/icon.less","extensions/MobileFrontend/resources/mobile.startup/panel.less","resources/src/mediawiki.less/mediawiki.mixins.animation.less","resources/src/mediawiki.less/mediawiki.mixins.less","resources/src/mediawiki.less/mediawiki.ui/variables.less","skins/MinervaNeue/minerva.less/minerva.mixins.less","skins/MinervaNeue/minerva.less/minerva.variables.less","skins/MinervaNeue/skinStyles/mobile.startup/Overlay.less","skins/MinervaNeue/skinStyles/mobile.startup/images/error.svg","skins/MinervaNeue/skinStyles/mobile.startup/skin.less","skins/MinervaNeue/skinStyles/m Apr 27 18:00:00 db postgres[60412]: [8-8] azurlane_wiki HINT: See server log for query details. Apr 27 18:00:00 db postgres[60412]: [8-9] azurlane_wiki CONTEXT: while updating tuple (213,16) in relation "module_deps" Apr 27 18:00:00 db postgres[60412]: [8-10] azurlane_wiki STATEMENT: UPDATE /* Wikimedia\Rdbms\Database::upsert */ "module_deps" SET md_deps = '["resources/src/jquery/jquery.makeCollapsible.styles.less"]' WHERE ((md_module = 'jquery.makeCollapsible.styles') OR (md_skin = 'vector|en-gb'))
This leads me to think there is some faulty logic in the implementation. Race conditions are unavoidable as there are multiple threads running, but deadlocks, in my opinion, should not happen like this.
Steps to Reproduce:
Run MediaWiki 1.30 with the PostgreSQL upsert() patch, or 1.32.0 stable.
Actual Results:
Abundance of deadlock errors in the PostgreSQL error log.
Expected Results:
No deadlock errors in the PostgreSQL error log.