Page MenuHomePhabricator

ThreadItemStore::findNewestRevisionsByHeading uses primary DB method calls for replica DB query, causing thousands of TransactionProfiler warnings
Closed, ResolvedPublicPRODUCTION ERROR

Description

Summary

ThreadItemStore::findNewestRevisionsByHeading is interacting with the primary DB on GET requests to use methods such as IReadableDatabase::anyString and IReadableDatabaes::expr. This is causing 60,000 TransactionProfiler warnings a week. Instead a replica DB connection should be used to interact with these methods, as fetching the primary DB may cause MediaWiki to interact with the primary database itself (even without performing queries)

Error

message
Expectation (masterConns <= 0) by MediaWiki\Api\ApiMain::setRequestExpectations not met (actual: 1):
[connect to db2212 (enwiki)]
trace
from /srv/mediawiki/php-1.46.0-wmf.17/includes/libs/Rdbms/TransactionProfiler.php(569)
#0 /srv/mediawiki/php-1.46.0-wmf.17/includes/libs/Rdbms/TransactionProfiler.php(302): Wikimedia\Rdbms\TransactionProfiler->reportExpectationViolated(string, string, int)
#1 /srv/mediawiki/php-1.46.0-wmf.17/includes/libs/Rdbms/LoadBalancer/LoadBalancer.php(810): Wikimedia\Rdbms\TransactionProfiler->recordConnection(string, string, bool)
#2 /srv/mediawiki/php-1.46.0-wmf.17/includes/libs/Rdbms/LoadBalancer/LoadBalancer.php(789): Wikimedia\Rdbms\LoadBalancer->getServerConnection(int, string, int)
#3 /srv/mediawiki/php-1.46.0-wmf.17/includes/libs/Rdbms/Database/DBConnRef.php(109): Wikimedia\Rdbms\LoadBalancer->getConnectionInternal(int, array, string, int)
#4 /srv/mediawiki/php-1.46.0-wmf.17/includes/libs/Rdbms/Database/DBConnRef.php(127): Wikimedia\Rdbms\DBConnRef->ensureConnection()
#5 /srv/mediawiki/php-1.46.0-wmf.17/includes/libs/Rdbms/Database/DBConnRef.php(638): Wikimedia\Rdbms\DBConnRef->__call(string, array)
#6 /srv/mediawiki/php-1.46.0-wmf.17/extensions/DiscussionTools/includes/ThreadItemStore.php(187): Wikimedia\Rdbms\DBConnRef->anyString()
#7 /srv/mediawiki/php-1.46.0-wmf.17/extensions/DiscussionTools/includes/ApiDiscussionToolsFindComment.php(60): MediaWiki\Extension\DiscussionTools\ThreadItemStore->findNewestRevisionsByHeading(string, int, MediaWiki\Title\TitleValue)
#8 /srv/mediawiki/php-1.46.0-wmf.17/includes/Api/ApiMain.php(2062): MediaWiki\Extension\DiscussionTools\ApiDiscussionToolsFindComment->execute()
#9 /srv/mediawiki/php-1.46.0-wmf.17/includes/Api/ApiMain.php(967): MediaWiki\Api\ApiMain->executeAction()
#10 /srv/mediawiki/php-1.46.0-wmf.17/includes/Api/ApiMain.php(938): MediaWiki\Api\ApiMain->executeActionWithErrorHandling()
#11 /srv/mediawiki/php-1.46.0-wmf.17/includes/Api/ApiEntryPoint.php(138): MediaWiki\Api\ApiMain->execute()
#12 /srv/mediawiki/php-1.46.0-wmf.17/includes/MediaWikiEntryPoint.php(180): MediaWiki\Api\ApiEntryPoint->execute()
#13 /srv/mediawiki/php-1.46.0-wmf.17/api.php(30): MediaWiki\MediaWikiEntryPoint->run()
#14 /srv/mediawiki/w/api.php(3): require(string)
#15 {main}

Acceptance criteria

  • The TransactionProfiler warnings are no longer created

Event Timeline

Dreamy_Jazz renamed this task from ThreadItemStore::findNewestRevisionsByHeading uses primary DB for ::anyString and ::expr method calls when querying a replica DB, causing TransactionProfiler warnings to ThreadItemStore::findNewestRevisionsByHeading uses primary DB for ::anyString and ::expr method calls when querying a replica DB, causing thousands of TransactionProfiler warnings.Mar 4 2026, 3:16 PM
Dreamy_Jazz renamed this task from ThreadItemStore::findNewestRevisionsByHeading uses primary DB for ::anyString and ::expr method calls when querying a replica DB, causing thousands of TransactionProfiler warnings to ThreadItemStore::findNewestRevisionsByHeading uses primary DB method calls for replica DB query, causing thousands of TransactionProfiler warnings.

Change #1248036 had a related patch set uploaded (by Bartosz Dziewoński; author: Bartosz Dziewoński):

[mediawiki/extensions/DiscussionTools@master] ThreadItemStore: Don't use primary DB when building queries for replica DB

https://gerrit.wikimedia.org/r/1248036

Change #1248036 merged by jenkins-bot:

[mediawiki/extensions/DiscussionTools@master] ThreadItemStore: Don't use primary DB when building queries for replica DB

https://gerrit.wikimedia.org/r/1248036

matmarex claimed this task.