Page MenuHomePhabricator

TranslatePageMoveJob segmentation fault
Closed, ResolvedPublicBUG REPORT

Description

Hello kde Userbase wiki (https://userbase.kde.org) was hit by a bug.

Steps to Reproduce:

  1. Move a translated page with the translations
  2. in the console execute a php maintainance/runJobs.php

Actual Results:

The page is moved with the translations

Expected Results:

Segfault and nothing is moved

It's probably an infinite recursion error. Here is the stack trace:

#0 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(482): Wikimedia\Rdbms\Database::getClass(string, NULL)
#1 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/loadbalancer/LoadBalancer.php(1013): Wikimedia\Rdbms\Database::attributesFromType(string, NULL)
#2 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/loadbalancer/LoadBalancer.php(697): Wikimedia\Rdbms\LoadBalancer->getServerAttributes(integer)
#3 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/loadbalancer/LoadBalancer.php(831): Wikimedia\Rdbms\LoadBalancer->getConnection(integer, array, boolean, integer)
#4 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueueDB.php(783): Wikimedia\Rdbms\LoadBalancer->getConnectionRef(integer, array, string, integer)
#5 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueueDB.php(764): JobQueueDB->getDB(integer)
#6 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueueDB.php(728): JobQueueDB->getMasterDB()
#7 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueueDB.php(224): JobQueueDB->insertFields(JobSpecification)
#8 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueueDB.php(200): JobQueueDB->doBatchPushInternal(Wikimedia\Rdbms\DBConnRef, array, integer, string)
#9 [internal function]: JobQueueDB->{closure}()
#10 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3267): call_user_func(Closure)
#11 [internal function]: Wikimedia\Rdbms\Database->onTransactionPreCommitOrIdle(Closure, string)
#12 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/DBConnRef.php(49): call_user_func_array(array, array)
#13 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/DBConnRef.php(491): Wikimedia\Rdbms\DBConnRef->__call(string, array)
#14 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueueDB.php(202): Wikimedia\Rdbms\DBConnRef->onTransactionPreCommitOrIdle(Closure, string)
#15 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueue.php(336): JobQueueDB->doBatchPush(array, integer)
#16 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueue.php(306): JobQueue->batchPush(array, integer)
#17 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueueGroup.php(160): JobQueue->push(array)
#18 /srv/www/mediawiki/mediawiki-new/includes/deferred/DeferredUpdates.php(317): JobQueueGroup->push(array)
#19 /srv/www/mediawiki/mediawiki-new/includes/deferred/DeferredUpdates.php(299): DeferredUpdates::enqueueUpdates(array)
#20 /srv/www/mediawiki/mediawiki-new/maintenance/Maintenance.php(646): DeferredUpdates::tryOpportunisticExecute(string)
#21 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3461): Maintenance::{closure}(integer, Wikimedia\Rdbms\DatabaseMysqli)
#22 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3795): Wikimedia\Rdbms\Database->runTransactionListenerCallbacks(integer)
#23 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3582): Wikimedia\Rdbms\Database->commit(string, string)
#24 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3268): Wikimedia\Rdbms\Database->endAtomic(string)
#25 [internal function]: Wikimedia\Rdbms\Database->onTransactionPreCommitOrIdle(Closure, string)
#26 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/DBConnRef.php(49): call_user_func_array(array, array)
#27 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/DBConnRef.php(491): Wikimedia\Rdbms\DBConnRef->__call(string, array)
#28 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueueDB.php(202): Wikimedia\Rdbms\DBConnRef->onTransactionPreCommitOrIdle(Closure, string)
#29 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueue.php(336): JobQueueDB->doBatchPush(array, integer)
#30 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueue.php(306): JobQueue->batchPush(array, integer)
#31 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueueGroup.php(160): JobQueue->push(array)
#32 /srv/www/mediawiki/mediawiki-new/includes/deferred/DeferredUpdates.php(317): JobQueueGroup->push(array)
#33 /srv/www/mediawiki/mediawiki-new/includes/deferred/DeferredUpdates.php(299): DeferredUpdates::enqueueUpdates(array)
#34 /srv/www/mediawiki/mediawiki-new/maintenance/Maintenance.php(646): DeferredUpdates::tryOpportunisticExecute(string)
#35 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3461): Maintenance::{closure}(integer, Wikimedia\Rdbms\DatabaseMysqli)
#36 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3795): Wikimedia\Rdbms\Database->runTransactionListenerCallbacks(integer)
#37 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3582): Wikimedia\Rdbms\Database->commit(string, string)
#38 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3268): Wikimedia\Rdbms\Database->endAtomic(string)
#39 [internal function]: Wikimedia\Rdbms\Database->onTransactionPreCommitOrIdle(Closure, string)
#40 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/DBConnRef.php(49): call_user_func_array(array, array)
#41 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/DBConnRef.php(491): Wikimedia\Rdbms\DBConnRef->__call(string, array)
#42 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueueDB.php(202): Wikimedia\Rdbms\DBConnRef->onTransactionPreCommitOrIdle(Closure, string)
#43 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueue.php(336): JobQueueDB->doBatchPush(array, integer)
#44 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueue.php(306): JobQueue->batchPush(array, integer)
#45 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueueGroup.php(160): JobQueue->push(array)
#46 /srv/www/mediawiki/mediawiki-new/includes/deferred/DeferredUpdates.php(317): JobQueueGroup->push(array)
#47 /srv/www/mediawiki/mediawiki-new/includes/deferred/DeferredUpdates.php(299): DeferredUpdates::enqueueUpdates(array)
#48 /srv/www/mediawiki/mediawiki-new/maintenance/Maintenance.php(646): DeferredUpdates::tryOpportunisticExecute(string)
#49 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3461): Maintenance::{closure}(integer, Wikimedia\Rdbms\DatabaseMysqli)
#50 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3795): Wikimedia\Rdbms\Database->runTransactionListenerCallbacks(integer)
#51 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3582): Wikimedia\Rdbms\Database->commit(string, string)
#52 /srv/www/mediawiki/mediawiki-new/includes/libs/rdbms/database/Database.php(3268): Wikimedia\Rdbms\Database->endAtomic(string)

The loop in question appears to start after this:

#2031 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueue.php(336): JobQueueDB->doBatchPush(array, integer)
#2032 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueue.php(306): JobQueue->batchPush(array, integer)
#2033 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobQueueGroup.php(160): JobQueue->push(array)
#2034 /srv/www/mediawiki/mediawiki-new/includes/deferred/DeferredUpdates.php(317): JobQueueGroup->push(array)
#2035 /srv/www/mediawiki/mediawiki-new/includes/deferred/DeferredUpdates.php(299): DeferredUpdates::enqueueUpdates(array)
#2036 /srv/www/mediawiki/mediawiki-new/includes/deferred/DeferredUpdates.php(97): DeferredUpdates::tryOpportunisticExecute(string)
#2037 /srv/www/mediawiki/mediawiki-new/includes/deferred/DeferredUpdates.php(114): DeferredUpdates::addUpdate(MWCallableUpdate, integer)
#2038 /srv/www/mediawiki/mediawiki-new/includes/logging/LogEntry.php(788): DeferredUpdates::addCallableUpdate(Closure, integer, Wikimedia\Rdbms\DatabaseMysqli)
#2039 /srv/www/mediawiki/mediawiki-new/includes/MovePage.php(615): ManualLogEntry->publish(integer)
#2040 /srv/www/mediawiki/mediawiki-new/includes/MovePage.php(271): MovePage->moveToInternal(User, Title, string, boolean, array)
#2041 /srv/www/mediawiki/mediawiki-new/extensions/Translate/tag/TranslatablePageMoveJob.php(97): MovePage->move(User, string, boolean)
#2042 /srv/www/mediawiki/mediawiki-new/extensions/Translate/tag/TranslatablePageMoveJob.php(54): TranslatablePageMoveJob->doMoves()
#2043 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobRunner.php(296): TranslatablePageMoveJob->run()
#2044 /srv/www/mediawiki/mediawiki-new/includes/jobqueue/JobRunner.php(193): JobRunner->executeJob(TranslatablePageMoveJob, Wikimedia\Rdbms\LBFactorySimple, BufferingStatsdDataFactory, integer)
#2045 /srv/www/mediawiki/mediawiki-new/maintenance/runJobs.php(89): JobRunner->run(array)
#2046 /srv/www/mediawiki/mediawiki-new/maintenance/doMaintenance.php(94): RunJobs->execute()
#2047 /srv/www/mediawiki/mediawiki-new/maintenance/runJobs.php(122): require_once(string)
#2048 {main}

We are tracking this bug in the following phabricator task https://phabricator.kde.org/T11917

ProductVersion
MediaWiki1.31.3 (c2d388d) 14:05, 10 January 2016
PHP7.2.24-0ubuntu0.18.04.1 (fpm-fcgi)
MySQL5.7.27-0ubuntu0.18.04.1
ICU60.2
Translate2019-04-24 (0e35cb0) 18:14, 24 October 2019

Event Timeline

Nikerabbit subscribed.

0e35cb0551daaf5ee4ee1a015d0617d16ca8da75 is unknown hash for Translate. Do you have local modifications? I don't it matters though, as I believe this is an issue with MediaWiki core.

Yes we have a local modification closely related to T213426. But this shouldn't affect the backend.

I did the update to the new LTS version of mediawiki yesterday and now I get a new error:

[de6e72a5a77c469204198de1] [no req]   Error from line 78 of /srv/www/mediawiki/mediawiki-1.34.2/extensions/Translate/tag/TranslationsUpdateJob.php: Call to a member function clearCaches() on null
Backtrace:
#0 /srv/www/mediawiki/mediawiki-1.34.2/includes/jobqueue/JobRunner.php(299): TranslationsUpdateJob->run()
#1 /srv/www/mediawiki/mediawiki-1.34.2/includes/jobqueue/JobRunner.php(192): JobRunner->executeJob()
#2 /srv/www/mediawiki/mediawiki-1.34.2/maintenance/runJobs.php(92): JobRunner->run()
#3 /srv/www/mediawiki/mediawiki-1.34.2/maintenance/doMaintenance.php(99): RunJobs->execute()
#4 /srv/www/mediawiki/mediawiki-1.34.2/maintenance/runJobs.php(129): require_once(string)
#5 {main}

This was my trivial fix line 78 in Translate/tag/TranslationsUpdateJob.php

-$page->getMessageGroup()->clearCaches();
+if ($page->getMessageGroup()) {
+    $page->getMessageGroup()->clearCaches();
+}

I am also seeing this same problem. Try to move a translated page results in a segfault

Product Version
MediaWiki 1.35.4
PHP 7.3.32 (fpm-fcgi)
MariaDB 10.2.41-MariaDB
ICU 69.1
Translate 2021-07-26 MLEB 2021.07 GPL-2.0-or-later

$ php maintenance/runJobs.php
2021-11-13 14:28:34 recentChangesUpdate Special:RecentChanges type=cacheUpdate namespace=-1 title=RecentChanges requestId=YY_KN9bLsQLtIM97D2kK1AAAkQY (id=5680326,timestamp=20211113142247) STARTING
2021-11-13 14:28:34 recentChangesUpdate Special:RecentChanges type=cacheUpdate namespace=-1 title=RecentChanges requestId=YY_KN9bLsQLtIM97D2kK1AAAkQY (id=5680326,timestamp=20211113142247) t=5 good
2021-11-13 14:28:34 TranslatablePageMoveJob Mongoose_2nd source=New Traveller target=Mongoose 2nd moves=array(37) summary=Part of translatable page "New Traveller" performer=Tjoneslo namespace=0 title=Mongoose_2nd requestId=YY_LU7-r5kH7kZGjzOu6iAAAyRM (id=5680345,timestamp=20211113142731) STARTING
Segmentation fault

I've not chased stack traces but can try to reproduce on the test server if needed.

Have you tried the new moveTranslatablePage.php maintenance script? Does it have the same issue?

This segfault / infinite recursion issue is likely to be duplicate of T268840: Infinite loop in DeferredUpdates::tryOpportunisticExecute and it is fixed in MediaWiki 1.36.


I did the update to the new LTS version of mediawiki yesterday and now I get a new error:

That's a separate issue. We have seen it occasionally on translatewiki.net. Have not been able to figure out the cause yet.

Translate should be using master shouldn't it when installed not REL branches. Has anyone here found the issues using the packages from the MLEB releases?

Nikerabbit claimed this task.