Page MenuHomePhabricator

Do not write to database in GET request context when updating personaldashboard-visited
Closed, ResolvedPublic2 Estimated Story Points

Description

We're seeing a lot of warnings from our newly created OpenSearch Dashboard (round 2):

This is because a database write is happening on render, we should update this preference in the client so we're not violating the db write on GET request rule.

Something like so:

await api.postWithEditToken( {
	action: 'options',
	optionname: 'personaldashboard-visited',
	optionvalue: '1'',
	formatversion: 2
} );

Acceptance Criteria:

  • Warning is no longer appearing in our logstash dashboard
  • Database write not happening during GET request

Event Timeline

Kgraessle triaged this task as High priority.
Kgraessle set the point value for this task to 2.
Kgraessle moved this task from Ready to In Progress on the Moderator-Tools-Team (Kanban) board.

Change #1269374 had a related patch set uploaded (by Kgraessle; author: Kgraessle):

[mediawiki/extensions/PersonalDashboard@master] Use Deferred Updates when saving user preference personaldashboard-visited

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

Change #1269374 merged by jenkins-bot:

[mediawiki/extensions/PersonalDashboard@master] Use Deferred Updates when saving user preference personaldashboard-visited

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

from /srv/mediawiki/php-1.46.0-wmf.24/includes/libs/Rdbms/TransactionProfiler.php(569)
#0 /srv/mediawiki/php-1.46.0-wmf.24/includes/libs/Rdbms/TransactionProfiler.php(302): Wikimedia\Rdbms\TransactionProfiler->reportExpectationViolated(string, string, int)
#1 /srv/mediawiki/php-1.46.0-wmf.24/includes/libs/Rdbms/LoadBalancer/LoadBalancer.php(810): Wikimedia\Rdbms\TransactionProfiler->recordConnection(string, string, bool)
#2 /srv/mediawiki/php-1.46.0-wmf.24/includes/libs/Rdbms/LoadBalancer/LoadBalancer.php(789): Wikimedia\Rdbms\LoadBalancer->getServerConnection(int, string, int)
#3 /srv/mediawiki/php-1.46.0-wmf.24/includes/libs/Rdbms/Database/DBConnRef.php(109): Wikimedia\Rdbms\LoadBalancer->getConnectionInternal(int, array, string, int)
#4 /srv/mediawiki/php-1.46.0-wmf.24/includes/libs/Rdbms/Database/DBConnRef.php(127): Wikimedia\Rdbms\DBConnRef->ensureConnection()
#5 /srv/mediawiki/php-1.46.0-wmf.24/includes/libs/Rdbms/Database/DBConnRef.php(407): Wikimedia\Rdbms\DBConnRef->__call(string, array)
#6 /srv/mediawiki/php-1.46.0-wmf.24/includes/libs/Rdbms/QueryBuilder/SelectQueryBuilder.php(809): Wikimedia\Rdbms\DBConnRef->selectRow(array, array, array, string, array, array)
#7 /srv/mediawiki/php-1.46.0-wmf.24/extensions/CentralAuth/includes/User/CentralAuthUser.php(579): Wikimedia\Rdbms\SelectQueryBuilder->fetchRow()
#8 /srv/mediawiki/php-1.46.0-wmf.24/extensions/CentralAuth/includes/User/CentralAuthUser.php(482): MediaWiki\Extension\CentralAuth\User\CentralAuthUser->loadFromDatabase()
#9 /srv/mediawiki/php-1.46.0-wmf.24/extensions/CentralAuth/includes/User/CentralAuthUser.php(777): MediaWiki\Extension\CentralAuth\User\CentralAuthUser->loadState()
#10 /srv/mediawiki/php-1.46.0-wmf.24/extensions/CentralAuth/includes/CentralAuthHooks.php(440): MediaWiki\Extension\CentralAuth\User\CentralAuthUser->isAttached()
#11 /srv/mediawiki/php-1.46.0-wmf.24/includes/HookContainer/HookContainer.php(135): MediaWiki\Extension\CentralAuth\CentralAuthHooks->onUserSaveSettings(MediaWiki\User\User)
#12 /srv/mediawiki/php-1.46.0-wmf.24/includes/HookContainer/HookRunner.php(5062): MediaWiki\HookContainer\HookContainer->run(string, array)
#13 /srv/mediawiki/php-1.46.0-wmf.24/includes/User/Options/UserOptionsManager.php(316): MediaWiki\HookContainer\HookRunner->onUserSaveSettings(MediaWiki\User\User)
#14 /srv/mediawiki/php-1.46.0-wmf.24/extensions/PersonalDashboard/src/Specials/SpecialPersonalDashboard.php(82): MediaWiki\User\Options\UserOptionsManager->saveOptions(MediaWiki\User\User)
#15 /srv/mediawiki/php-1.46.0-wmf.24/includes/Deferred/MWCallableUpdate.php(52): MediaWiki\Extension\PersonalDashboard\Specials\SpecialPersonalDashboard::MediaWiki\Extension\PersonalDashboard\Specials\{closure}(string)
#16 /srv/mediawiki/php-1.46.0-wmf.24/includes/Deferred/DeferredUpdates.php(448): MediaWiki\Deferred\MWCallableUpdate->doUpdate()
#17 /srv/mediawiki/php-1.46.0-wmf.24/includes/Deferred/DeferredUpdates.php(187): MediaWiki\Deferred\DeferredUpdates::attemptUpdate(MediaWiki\Deferred\MWCallableUpdate)
#18 /srv/mediawiki/php-1.46.0-wmf.24/includes/Deferred/DeferredUpdates.php(277): MediaWiki\Deferred\DeferredUpdates::run(MediaWiki\Deferred\MWCallableUpdate)
#19 /srv/mediawiki/php-1.46.0-wmf.24/includes/Deferred/DeferredUpdatesScope.php(229): MediaWiki\Deferred\DeferredUpdates::MediaWiki\Deferred\{closure}(MediaWiki\Deferred\MWCallableUpdate, int)
#20 /srv/mediawiki/php-1.46.0-wmf.24/includes/Deferred/DeferredUpdatesScope.php(158): MediaWiki\Deferred\DeferredUpdatesScope->processStageQueue(int, int, Closure)
#21 /srv/mediawiki/php-1.46.0-wmf.24/includes/Deferred/DeferredUpdates.php(271): MediaWiki\Deferred\DeferredUpdatesScope->processUpdates(int, Closure)
#22 /srv/mediawiki/php-1.46.0-wmf.24/includes/MediaWikiEntryPoint.php(652): MediaWiki\Deferred\DeferredUpdates::doUpdates()
#23 /srv/mediawiki/php-1.46.0-wmf.24/includes/MediaWikiEntryPoint.php(474): MediaWiki\MediaWikiEntryPoint->restInPeace()
#24 /srv/mediawiki/php-1.46.0-wmf.24/includes/MediaWikiEntryPoint.php(432): MediaWiki\MediaWikiEntryPoint->doPostOutputShutdown()
#25 /srv/mediawiki/php-1.46.0-wmf.24/includes/MediaWikiEntryPoint.php(189): MediaWiki\MediaWikiEntryPoint->postOutputShutdown()
#26 /srv/mediawiki/php-1.46.0-wmf.24/index.php(44): MediaWiki\MediaWikiEntryPoint->run()
#27 /srv/mediawiki/w/index.php(3): require(string)
#28 {main}

Still seeing an error on trwiki

Ok upon further research this is still a violation which makes sense as we're writing to the DB on a GET request.
The correct way to fix this would be to call the mw.Api to update this preference from the client side.

We could call something like:

await api.postWithEditToken( {
	action: 'options',
	optionname: 'personaldashboard-visited',
	optionvalue: '1'',
	formatversion: 2
} );
Kgraessle updated the task description. (Show Details)
Kgraessle renamed this task from Use Deferred Updates when saving user preference personaldashboard-visited to Do not write to database in GET request context when updating personaldashboard-visited.Apr 17 2026, 9:43 AM
Scardenasmolinar changed the task status from Open to In Progress.Apr 20 2026, 7:30 PM
Scardenasmolinar claimed this task.
Scardenasmolinar moved this task from Ready to In Progress on the Moderator-Tools-Team (Kanban) board.

Change #1276103 had a related patch set uploaded (by Scardenasmolinar; author: Scardenasmolinar):

[mediawiki/extensions/PersonalDashboard@master] Move save user option to client side

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

Change #1276103 merged by jenkins-bot:

[mediawiki/extensions/PersonalDashboard@master] Move save user option for personaldashboard-visited to client side

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

I just merged this and then had a thought afterward- we probably only want to call this the first time they visit not every time the component is mounted- though this can be done in a follow up patch.

Kgraessle updated the task description. (Show Details)
Kgraessle moved this task from QA to Done on the Moderator-Tools-Team (Kanban) board.

I validated in logstash that this error is no longer happening.