Page MenuHomePhabricator

TypeError: MediaWiki\User\User::getName(): Return value must be of type string, null returned
Closed, ResolvedPublicPRODUCTION ERROR

Description

Error
normalized_message
[{reqId}] {exception_url}   TypeError: MediaWiki\User\User::getName(): Return value must be of type string, null returned
FrameLocationCall
from/srv/mediawiki/php-1.44.0-wmf.19/includes/user/User.php(1609)
#0/srv/mediawiki/php-1.44.0-wmf.19/includes/user/Options/UserOptionsManager.php(562)MediaWiki\User\User->getName()
#1/srv/mediawiki/php-1.44.0-wmf.19/includes/user/Options/UserOptionsManager.php(414)MediaWiki\User\Options\UserOptionsManager->getCacheKey(MediaWiki\User\User)
#2/srv/mediawiki/php-1.44.0-wmf.19/includes/user/Options/UserOptionsManager.php(176)MediaWiki\User\Options\UserOptionsManager->loadUserOptions(MediaWiki\User\User, int)
#3/srv/mediawiki/php-1.44.0-wmf.19/includes/context/RequestContext.php(471)MediaWiki\User\Options\UserOptionsManager->getOption(MediaWiki\User\User, string)
#4/srv/mediawiki/php-1.44.0-wmf.19/includes/parser/ParserOptions.php(1143)MediaWiki\Context\RequestContext->getLanguage()
#5/srv/mediawiki/php-1.44.0-wmf.19/includes/language/MessageParser.php(72)MediaWiki\Parser\ParserOptions::newFromContext(MediaWiki\Context\RequestContext)
#6/srv/mediawiki/php-1.44.0-wmf.19/includes/language/MessageParser.php(176)MediaWiki\Language\MessageParser->getParserOptions()
#7/srv/mediawiki/php-1.44.0-wmf.19/includes/language/MessageParser.php(156)MediaWiki\Language\MessageParser->parseWithoutPostprocessing(string, MediaWiki\Page\PageReferenceValue, bool, bool, MediaWiki\Language\Language)
#8/srv/mediawiki/php-1.44.0-wmf.19/includes/language/Message/Message.php(1460)MediaWiki\Language\MessageParser->parse(string, MediaWiki\Page\PageReferenceValue, bool, bool, MediaWiki\Language\Language)
#9/srv/mediawiki/php-1.44.0-wmf.19/includes/language/Message/Message.php(1050)MediaWiki\Message\Message->parseText(string)
#10/srv/mediawiki/php-1.44.0-wmf.19/includes/language/Message/Message.php(1092)MediaWiki\Message\Message->format(string)
#11/srv/mediawiki/php-1.44.0-wmf.19/extensions/TemplateSandbox/includes/Hooks.php(577)MediaWiki\Message\Message->parse()
#12/srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/FileModule.php(1327)MediaWiki\Extension\TemplateSandbox\Hooks::getParsedMessages(MediaWiki\ResourceLoader\Context, MediaWiki\Config\GlobalVarConfig, null)
#13/srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/FileModule.php(1183)MediaWiki\ResourceLoader\FileModule->expandFileInfo(MediaWiki\ResourceLoader\Context, array, string)
#14/srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/FileModule.php(602)MediaWiki\ResourceLoader\FileModule->expandPackageFiles(MediaWiki\ResourceLoader\Context)
#15/srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/Module.php(873)MediaWiki\ResourceLoader\FileModule->getDefinitionSummary(MediaWiki\ResourceLoader\Context)
#16/srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/StartUpModule.php(223)MediaWiki\ResourceLoader\Module->getVersionHash(MediaWiki\ResourceLoader\Context)
#17/srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/StartUpModule.php(428)MediaWiki\ResourceLoader\StartUpModule->getModuleRegistrations(MediaWiki\ResourceLoader\Context)
#18/srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/Module.php(759)MediaWiki\ResourceLoader\StartUpModule->getScript(MediaWiki\ResourceLoader\Context)
#19/srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/Module.php(734)MediaWiki\ResourceLoader\Module->buildContent(MediaWiki\ResourceLoader\Context)
#20/srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/Module.php(870)MediaWiki\ResourceLoader\Module->getModuleContent(MediaWiki\ResourceLoader\Context)
#21/srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/ResourceLoader.php(611)MediaWiki\ResourceLoader\Module->getVersionHash(MediaWiki\ResourceLoader\Context)
#22/srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/ResourceLoader.php(711)MediaWiki\ResourceLoader\ResourceLoader->getCombinedVersion(MediaWiki\ResourceLoader\Context, array)
#23/srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/ResourceLoaderEntryPoint.php(54)MediaWiki\ResourceLoader\ResourceLoader->respond(MediaWiki\ResourceLoader\Context)
#24/srv/mediawiki/php-1.44.0-wmf.19/includes/MediaWikiEntryPoint.php(202)MediaWiki\ResourceLoader\ResourceLoaderEntryPoint->execute()
#25/srv/mediawiki/php-1.44.0-wmf.19/load.php(42)MediaWiki\MediaWikiEntryPoint->run()
#26/srv/mediawiki/w/load.php(3)require(string)
#27{main}
Impact
Notes

Event Timeline

Looks like something wrong in the new MessageParser. It should not be loading user options on load.php requests.

There's an explicit User::isSafeToLoad() check in MessageParser::getParserOptions() which is somehow not getting triggered.

The immediate exception is Calculating version for "ext.eventLogging" failed: BadMethodCallException: Sessions are disabled for load entry point. Apparently ResourceLoader catches that exception, but that leaves the User object in an unclean state.

The user access happens somewhere in the callback in ext.eventLogging. I think it's the i18n logic in InstrumentConfigsFetcher::getConfigs() in MetricsPlatform that's invoked via the GetStreamConfigs hook somewhere during service setup for EventLogging.

Change #1126034 had a related patch set uploaded (by Gergő Tisza; author: Gergő Tisza):

[mediawiki/core@master] Avoid trying to load the session user in MW_NO_SESSION endpoints

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

Change #1126034 merged by jenkins-bot:

[mediawiki/core@master] Avoid trying to load the session user in MW_NO_SESSION endpoints

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

Change #1126196 had a related patch set uploaded (by Reedy; author: Gergő Tisza):

[mediawiki/core@REL1_43] Avoid trying to load the session user in MW_NO_SESSION endpoints

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

Change #1126197 had a related patch set uploaded (by Reedy; author: Gergő Tisza):

[mediawiki/core@REL1_42] Avoid trying to load the session user in MW_NO_SESSION endpoints

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

Change #1126198 had a related patch set uploaded (by Reedy; author: Gergő Tisza):

[mediawiki/core@REL1_39] Avoid trying to load the session user in MW_NO_SESSION endpoints

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

matmarex assigned this task to Tgr.

Change #1126198 merged by jenkins-bot:

[mediawiki/core@REL1_39] Avoid trying to load the session user in MW_NO_SESSION endpoints

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

Change #1126197 merged by jenkins-bot:

[mediawiki/core@REL1_42] Avoid trying to load the session user in MW_NO_SESSION endpoints

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

Change #1126196 merged by jenkins-bot:

[mediawiki/core@REL1_43] Avoid trying to load the session user in MW_NO_SESSION endpoints

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

The patch makes user access in no-session endpoints fail in a more predictable manner. It doesn't change the fact that some ResourceLoader callback is trying to access the user. The respective stack trace is

from /srv/mediawiki/php-1.44.0-wmf.19/includes/session/SessionManager.php(865)
#0 /srv/mediawiki/php-1.44.0-wmf.19/includes/session/SessionManager.php(203): MediaWiki\Session\SessionManager->getSessionFromInfo(MediaWiki\Session\SessionInfo, MediaWiki\Request\WebRequest)
#1 /srv/mediawiki/php-1.44.0-wmf.19/includes/Request/WebRequest.php(870): MediaWiki\Session\SessionManager->getSessionForRequest(MediaWiki\Request\WebRequest)
#2 /srv/mediawiki/php-1.44.0-wmf.19/includes/user/User.php(1099): MediaWiki\Request\WebRequest->getSession()
#3 /srv/mediawiki/php-1.44.0-wmf.19/includes/user/User.php(450): MediaWiki\User\User->loadFromSession()
#4 /srv/mediawiki/php-1.44.0-wmf.19/includes/user/User.php(1603): MediaWiki\User\User->load()
#5 /srv/mediawiki/php-1.44.0-wmf.19/includes/user/Options/UserOptionsManager.php(562): MediaWiki\User\User->getName()
#6 /srv/mediawiki/php-1.44.0-wmf.19/includes/user/Options/UserOptionsManager.php(414): MediaWiki\User\Options\UserOptionsManager->getCacheKey(MediaWiki\User\User)
#7 /srv/mediawiki/php-1.44.0-wmf.19/includes/user/Options/UserOptionsManager.php(176): MediaWiki\User\Options\UserOptionsManager->loadUserOptions(MediaWiki\User\User, int)
#8 /srv/mediawiki/php-1.44.0-wmf.19/includes/context/RequestContext.php(471): MediaWiki\User\Options\UserOptionsManager->getOption(MediaWiki\User\User, string)
#9 /srv/mediawiki/php-1.44.0-wmf.19/includes/language/Message/Message.php(852): MediaWiki\Context\RequestContext->getLanguage()
#10 /srv/mediawiki/php-1.44.0-wmf.19/includes/language/Message/Message.php(429): MediaWiki\Message\Message::MediaWiki\Message\{closure}()
#11 /srv/mediawiki/php-1.44.0-wmf.19/includes/language/Message/Message.php(1498): MediaWiki\Message\Message->getLanguage()
#12 /srv/mediawiki/php-1.44.0-wmf.19/includes/language/Message/Message.php(1013): MediaWiki\Message\Message->fetchMessage()
#13 /srv/mediawiki/php-1.44.0-wmf.19/includes/language/Message/Message.php(1117): MediaWiki\Message\Message->format(string)
#14 /srv/mediawiki/php-1.44.0-wmf.19/includes/Status/StatusFormatter.php(124): MediaWiki\Message\Message->plain()
#15 /srv/mediawiki/php-1.44.0-wmf.19/extensions/MetricsPlatform/includes/InstrumentConfigsFetcher.php(101): MediaWiki\Status\StatusFormatter->getWikiText(MediaWiki\Status\Status, array)
#16 /srv/mediawiki/php-1.44.0-wmf.19/includes/libs/objectcache/WANObjectCache.php(1834): MediaWiki\Extension\MetricsPlatform\InstrumentConfigsFetcher->MediaWiki\Extension\MetricsPlatform\{closure}(array, int, array, float, array)
#17 /srv/mediawiki/php-1.44.0-wmf.19/includes/libs/objectcache/WANObjectCache.php(1639): Wikimedia\ObjectCache\WANObjectCache->fetchOrRegenerate(string, int, Closure, array, array)
#18 /srv/mediawiki/php-1.44.0-wmf.19/extensions/MetricsPlatform/includes/InstrumentConfigsFetcher.php(129): Wikimedia\ObjectCache\WANObjectCache->getWithSetCallback(string, int, Closure, array)
#19 /srv/mediawiki/php-1.44.0-wmf.19/extensions/MetricsPlatform/includes/InstrumentConfigsFetcher.php(57): MediaWiki\Extension\MetricsPlatform\InstrumentConfigsFetcher->getConfigs(int)
#20 /srv/mediawiki/php-1.44.0-wmf.19/extensions/MetricsPlatform/includes/Hooks.php(86): MediaWiki\Extension\MetricsPlatform\InstrumentConfigsFetcher->getInstrumentConfigs()
#21 /srv/mediawiki/php-1.44.0-wmf.19/includes/HookContainer/HookContainer.php(155): MediaWiki\Extension\MetricsPlatform\Hooks->onGetStreamConfigs(array)
#22 /srv/mediawiki/php-1.44.0-wmf.19/extensions/EventStreamConfig/includes/Hooks/HookRunner.php(28): MediaWiki\HookContainer\HookContainer->run(string, array, array)
#23 /srv/mediawiki/php-1.44.0-wmf.19/extensions/EventStreamConfig/includes/StreamConfigsFactory.php(54): MediaWiki\Extension\EventStreamConfig\Hooks\HookRunner->onGetStreamConfigs(array)
#24 /srv/mediawiki/php-1.44.0-wmf.19/extensions/EventStreamConfig/includes/ServiceWiring.php(27): MediaWiki\Extension\EventStreamConfig\StreamConfigsFactory->getInstance()
#25 /srv/mediawiki/php-1.44.0-wmf.19/vendor/wikimedia/services/src/ServiceContainer.php(442): Wikimedia\Services\ServiceContainer::{closure}(MediaWiki\MediaWikiServices)
#26 /srv/mediawiki/php-1.44.0-wmf.19/vendor/wikimedia/services/src/ServiceContainer.php(406): Wikimedia\Services\ServiceContainer->createService(string)
#27 /srv/mediawiki/php-1.44.0-wmf.19/includes/MediaWikiServices.php(370): Wikimedia\Services\ServiceContainer->getService(string)
#28 /srv/mediawiki/php-1.44.0-wmf.19/extensions/EventLogging/ServiceWiring.php(31): MediaWiki\MediaWikiServices->getService(string)
#29 /srv/mediawiki/php-1.44.0-wmf.19/vendor/wikimedia/services/src/ServiceContainer.php(442): Wikimedia\Services\ServiceContainer::{closure}(MediaWiki\MediaWikiServices)
#30 /srv/mediawiki/php-1.44.0-wmf.19/vendor/wikimedia/services/src/ServiceContainer.php(406): Wikimedia\Services\ServiceContainer->createService(string)
#31 /srv/mediawiki/php-1.44.0-wmf.19/includes/MediaWikiServices.php(370): Wikimedia\Services\ServiceContainer->getService(string)
#32 /srv/mediawiki/php-1.44.0-wmf.19/extensions/EventLogging/includes/Hooks.php(185): MediaWiki\MediaWikiServices->getService(string)
#33 /srv/mediawiki/php-1.44.0-wmf.19/extensions/EventLogging/includes/Hooks.php(118): MediaWiki\Extension\EventLogging\Hooks::loadEventStreamConfigs()
#34 /srv/mediawiki/php-1.44.0-wmf.19/extensions/EventLogging/includes/Hooks.php(130): MediaWiki\Extension\EventLogging\Hooks::getEventLoggingConfig(MediaWiki\Config\GlobalVarConfig)
#35 /srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/FileModule.php(1327): MediaWiki\Extension\EventLogging\Hooks::getModuleData(MediaWiki\ResourceLoader\Context, MediaWiki\Config\GlobalVarConfig, null)
#36 /srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/FileModule.php(1183): MediaWiki\ResourceLoader\FileModule->expandFileInfo(MediaWiki\ResourceLoader\Context, array, string)
#37 /srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/FileModule.php(602): MediaWiki\ResourceLoader\FileModule->expandPackageFiles(MediaWiki\ResourceLoader\Context)
#38 /srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/Module.php(873): MediaWiki\ResourceLoader\FileModule->getDefinitionSummary(MediaWiki\ResourceLoader\Context)
#39 /srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/StartUpModule.php(223): MediaWiki\ResourceLoader\Module->getVersionHash(MediaWiki\ResourceLoader\Context)
#40 /srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/StartUpModule.php(428): MediaWiki\ResourceLoader\StartUpModule->getModuleRegistrations(MediaWiki\ResourceLoader\Context)
#41 /srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/Module.php(759): MediaWiki\ResourceLoader\StartUpModule->getScript(MediaWiki\ResourceLoader\Context)
#42 /srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/Module.php(734): MediaWiki\ResourceLoader\Module->buildContent(MediaWiki\ResourceLoader\Context)
#43 /srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/Module.php(870): MediaWiki\ResourceLoader\Module->getModuleContent(MediaWiki\ResourceLoader\Context)
#44 /srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/ResourceLoader.php(611): MediaWiki\ResourceLoader\Module->getVersionHash(MediaWiki\ResourceLoader\Context)
#45 /srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/ResourceLoader.php(711): MediaWiki\ResourceLoader\ResourceLoader->getCombinedVersion(MediaWiki\ResourceLoader\Context, array)
#46 /srv/mediawiki/php-1.44.0-wmf.19/includes/ResourceLoader/ResourceLoaderEntryPoint.php(54): MediaWiki\ResourceLoader\ResourceLoader->respond(MediaWiki\ResourceLoader\Context)
#47 /srv/mediawiki/php-1.44.0-wmf.19/includes/MediaWikiEntryPoint.php(202): MediaWiki\ResourceLoader\ResourceLoaderEntryPoint->execute()
#48 /srv/mediawiki/php-1.44.0-wmf.19/load.php(42): MediaWiki\MediaWikiEntryPoint->run()
#49 /srv/mediawiki/w/load.php(3): require(string)
#50 {main}

so IIUC now $message->parse() is safe to use in a no-session environment but $message->plain() is not. We should probably fix that.

Fix it in what direction?

The stack trace above looks like a bug in the MetricsPlatform extension to me - it shouldn't be trying to format messages in the current user's language when there isn't really a current user. (And it looks like it's just trying to format a debug log message, which should probably be hardcoded to English, so that's quite clearly a bug.)

Fix it in what direction?

Either one seems fine to me, but it's bad that changing $msg->parse() to $msg->plain() (which is an as harmless looking change as it gets) could bring down the site because it changes from a suppressed error to an actual exception.

The MetricsPlatform callback should also be fixed, independently of that.