Currently, we get a lot of row lock contention and issues afterwards because many edits trigger an update on category table at the same time on the same row:
Here is an example 641 updates happening around the same time: https://logstash.wikimedia.org/goto/aa95c0c4edb48c37c6c72aa065dc1966
It's usually because of mass upload or something like that. The query in question is:
UPDATE `category` SET cat_pages = cat_pages + 1,cat_files = cat_files + 1 WHERE cat_id = 359162936
and here is the stack trace:
from /srv/mediawiki/php-1.43.0-wmf.5/includes/libs/rdbms/TransactionProfiler.php(525)
#0 /srv/mediawiki/php-1.43.0-wmf.5/includes/libs/rdbms/TransactionProfiler.php(337): Wikimedia\Rdbms\TransactionProfiler->reportExpectationViolated(string, Wikimedia\Rdbms\Query, double, string, string)
#1 /srv/mediawiki/php-1.43.0-wmf.5/includes/libs/rdbms/database/TransactionManager.php(615): Wikimedia\Rdbms\TransactionProfiler->recordQueryCompletion(Wikimedia\Rdbms\Query, double, boolean, integer, string, string)
#2 /srv/mediawiki/php-1.43.0-wmf.5/includes/libs/rdbms/database/Database.php(828): Wikimedia\Rdbms\TransactionManager->recordQueryCompletion(Wikimedia\Rdbms\Query, double, boolean, integer, string)
#3 /srv/mediawiki/php-1.43.0-wmf.5/includes/libs/rdbms/database/Database.php(716): Wikimedia\Rdbms\Database->attemptQuery(Wikimedia\Rdbms\Query, string, boolean)
#4 /srv/mediawiki/php-1.43.0-wmf.5/includes/libs/rdbms/database/Database.php(643): Wikimedia\Rdbms\Database->executeQuery(Wikimedia\Rdbms\Query, string, integer)
#5 /srv/mediawiki/php-1.43.0-wmf.5/includes/libs/rdbms/database/Database.php(1501): Wikimedia\Rdbms\Database->query(Wikimedia\Rdbms\Query, string)
#6 /srv/mediawiki/php-1.43.0-wmf.5/includes/libs/rdbms/database/DBConnRef.php(126): Wikimedia\Rdbms\Database->update(string, array, array, string, array)
#7 /srv/mediawiki/php-1.43.0-wmf.5/includes/libs/rdbms/database/DBConnRef.php(420): Wikimedia\Rdbms\DBConnRef->__call(string, array)
#8 /srv/mediawiki/php-1.43.0-wmf.5/includes/libs/rdbms/querybuilder/UpdateQueryBuilder.php(332): Wikimedia\Rdbms\DBConnRef->update(string, array, array, string, array)
#9 /srv/mediawiki/php-1.43.0-wmf.5/includes/page/WikiPage.php(2924): Wikimedia\Rdbms\UpdateQueryBuilder->execute()
#10 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/LinksUpdate/CategoryLinksTable.php(320): WikiPage->updateCategoryCounts(array, array, integer)
#11 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/LinksUpdate/CategoryLinksTable.php(287): MediaWiki\Deferred\LinksUpdate\CategoryLinksTable->updateCategoryCounts(array, array)
#12 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/LinksUpdate/LinksTable.php(392): MediaWiki\Deferred\LinksUpdate\CategoryLinksTable->finishUpdate()
#13 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/LinksUpdate/LinksUpdate.php(225): MediaWiki\Deferred\LinksUpdate\LinksTable->update()
#14 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/LinksUpdate/LinksUpdate.php(185): MediaWiki\Deferred\LinksUpdate\LinksUpdate->doIncrementalUpdate()
#15 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/DeferredUpdates.php(486): MediaWiki\Deferred\LinksUpdate\LinksUpdate->doUpdate()
#16 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/RefreshSecondaryDataUpdate.php(110): MediaWiki\Deferred\DeferredUpdates::attemptUpdate(MediaWiki\Deferred\LinksUpdate\LinksUpdate)
#17 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/DeferredUpdates.php(486): RefreshSecondaryDataUpdate->doUpdate()
#18 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/DeferredUpdates.php(198): MediaWiki\Deferred\DeferredUpdates::attemptUpdate(RefreshSecondaryDataUpdate)
#19 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/DeferredUpdates.php(285): MediaWiki\Deferred\DeferredUpdates::run(RefreshSecondaryDataUpdate)
#20 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/DeferredUpdatesScope.php(266): MediaWiki\Deferred\DeferredUpdates::MediaWiki\Deferred\{closure}(RefreshSecondaryDataUpdate, integer)
#21 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/DeferredUpdatesScope.php(198): MediaWiki\Deferred\DeferredUpdatesScope->processStageQueue(integer, integer, Closure)
#22 /srv/mediawiki/php-1.43.0-wmf.5/includes/deferred/DeferredUpdates.php(304): MediaWiki\Deferred\DeferredUpdatesScope->processUpdates(integer, Closure)
#23 /srv/mediawiki/php-1.43.0-wmf.5/includes/MediaWikiEntryPoint.php(672): MediaWiki\Deferred\DeferredUpdates::doUpdates()
#24 /srv/mediawiki/php-1.43.0-wmf.5/includes/MediaWikiEntryPoint.php(495): MediaWiki\MediaWikiEntryPoint->restInPeace()
#25 /srv/mediawiki/php-1.43.0-wmf.5/includes/MediaWikiEntryPoint.php(453): MediaWiki\MediaWikiEntryPoint->doPostOutputShutdown()
#26 /srv/mediawiki/php-1.43.0-wmf.5/includes/MediaWikiEntryPoint.php(208): MediaWiki\MediaWikiEntryPoint->postOutputShutdown()
#27 /srv/mediawiki/php-1.43.0-wmf.5/api.php(44): MediaWiki\MediaWikiEntryPoint->run()
#28 /srv/mediawiki/w/api.php(3): require(string)
#29 {main}It is not really time sensitive to update this counter, I'm not sure why we are updating this in deferred update instead of a job (that we already seem to trigger regardless?). We do also trigger self-heal of that number under many conditions (such as action=purge if number of members is low). Not to mention that this number is not anything critical.
Maybe I'm missing something obvious. Please let me know.