Page MenuHomePhabricator

TypeError: Return value of MediaWiki\Extension\Phonos\Engine\Engine::isPersisted() must be of the type bool, null returned
Closed, ResolvedPublicPRODUCTION ERROR

Description

Repro
Error
  • mwversion: 1.40.0-alpha
  • reqId: Y2K8BEOoKhmKgM5X5U0NzAAAAAY
normalized_message
[{reqId}] {exception_url}   TypeError: Return value of MediaWiki\Extension\Phonos\Engine\Engine::isPersisted() must be of the type bool, null returned
exception.trace
from /srv/mediawiki/php-master/extensions/Phonos/includes/Engine/Engine.php(198)
#0 /srv/mediawiki/php-master/extensions/Phonos/includes/Phonos.php(161): MediaWiki\Extension\Phonos\Engine\Engine->isPersisted(string, string, string)
#1 [internal function]: MediaWiki\Extension\Phonos\Phonos->renderPhonos(string, array, Parser, PPFrame_Hash)
#2 /srv/mediawiki/php-master/includes/parser/Parser.php(4010): call_user_func_array(array, array)
#3 /srv/mediawiki/php-master/includes/parser/PPFrame_Hash.php(353): Parser->extensionSubstitution(array, PPFrame_Hash, boolean)
#4 /srv/mediawiki/php-master/includes/parser/Parser.php(2944): PPFrame_Hash->expand(PPNode_Hash_Tree, integer)
#5 /srv/mediawiki/php-master/includes/parser/Parser.php(1600): Parser->replaceVariables(string)
#6 /srv/mediawiki/php-master/includes/parser/Parser.php(872): Parser->internalParse(string, boolean, boolean)
#7 /srv/mediawiki/php-master/includes/parser/Parser.php(921): Parser->recursiveTagParse(string)
#8 /srv/mediawiki/php-master/includes/parser/Parsoid/Config/DataAccess.php(355): Parser->parseExtensionTagAsTopLevelDoc(string)
#9 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Wt2Html/TT/ExtensionHandler.php(138): MediaWiki\Parser\Parsoid\Config\DataAccess->parseWikitext(MediaWiki\Parser\Parsoid\Config\PageConfig, ParserOutput, string)
#10 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Wt2Html/TT/ExtensionHandler.php(279): Wikimedia\Parsoid\Wt2Html\TT\ExtensionHandler->onExtension(Wikimedia\Parsoid\Tokens\SelfclosingTagTk)
#11 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Wt2Html/TT/TokenHandler.php(150): Wikimedia\Parsoid\Wt2Html\TT\ExtensionHandler->onTag(Wikimedia\Parsoid\Tokens\SelfclosingTagTk)
#12 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Wt2Html/TokenTransformManager.php(132): Wikimedia\Parsoid\Wt2Html\TT\TokenHandler->process(array)
#13 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Wt2Html/TokenTransformManager.php(195): Wikimedia\Parsoid\Wt2Html\TokenTransformManager->processChunk(array)
#14 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Wt2Html/TokenTransformManager.php(193): Wikimedia\Parsoid\Wt2Html\TokenTransformManager->processChunkily(string, array)
#15 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Wt2Html/TreeBuilder/TreeBuilderStage.php(497): Wikimedia\Parsoid\Wt2Html\TokenTransformManager->processChunkily(string, array)
#16 [internal function]: Wikimedia\Parsoid\Wt2Html\TreeBuilder\TreeBuilderStage->processChunkily(string, array)
#17 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(905): Generator->current()
#18 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(180): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->processChunkily(string, array)
#19 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipelineFactory.php(299): Wikimedia\Parsoid\Wt2Html\ParserPipeline->parseChunkily(string, array)
#20 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Wikitext/ContentModelHandler.php(123): Wikimedia\Parsoid\Wt2Html\ParserPipelineFactory->parse(string)
#21 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Parsoid.php(172): Wikimedia\Parsoid\Wikitext\ContentModelHandler->toDOM(Wikimedia\Parsoid\Ext\ParsoidExtensionAPI)
#22 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/src/Parsoid.php(210): Wikimedia\Parsoid\Parsoid->parseWikitext(MediaWiki\Parser\Parsoid\Config\PageConfig, ParserOutput, array)
#23 /srv/mediawiki/php-master/includes/Rest/Handler/ParsoidHandler.php(781): Wikimedia\Parsoid\Parsoid->wikitext2html(MediaWiki\Parser\Parsoid\Config\PageConfig, array, NULL, ParserOutput)
#24 /srv/mediawiki/php-master/vendor/wikimedia/parsoid/extension/src/Rest/Handler/PageHandler.php(92): MediaWiki\Rest\Handler\ParsoidHandler->wt2html(MediaWiki\Parser\Parsoid\Config\PageConfig, array)
#25 /srv/mediawiki/php-master/includes/Rest/Router.php(487): MWParsoid\Rest\Handler\PageHandler->execute()
#26 /srv/mediawiki/php-master/includes/Rest/Router.php(406): MediaWiki\Rest\Router->executeHandler(MWParsoid\Rest\Handler\PageHandler)
#27 /srv/mediawiki/php-master/includes/Rest/EntryPoint.php(170): MediaWiki\Rest\Router->execute(MediaWiki\Rest\RequestFromGlobals)
#28 /srv/mediawiki/php-master/includes/Rest/EntryPoint.php(135): MediaWiki\Rest\EntryPoint->execute()
#29 /srv/mediawiki/php-master/rest.php(31): MediaWiki\Rest\EntryPoint::main()
#30 /srv/mediawiki/w/rest.php(3): require(string)
#31 {main}
Impact
Notes

Details

Request URL
https://en.wikipedia.beta.wmflabs.org/w/rest.php/en.wikipedia.beta.wmflabs.org/v3/page/pagebundle/Polar_bear/563981

Event Timeline

Change 852274 had a related patch set uploaded (by MusikAnimal; author: MusikAnimal):

[mediawiki/extensions/Phonos@master] Engine: cast return value of isPersisted() to bool

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

https://gerrit.wikimedia.org/r/852274 fixes the immediate issue, but then presumably Phonos is going to try to re-create the files, which probably will also still fail due to T321654? It might cause more problems on Beta... maybe the fatal exception as we see here is fine as-is?

On the other hand, FileBackend::fileExists() explicitly declares a return value of boolean or null, so we should be handling that accordingly. Kind of surprising my IDE and Phan didn't catch that! I think within the scope of Engine::isPersisted(), it probably makes sense to treat any I/O errors in FileBackend::fileExists() as "file is not persisted" and return false, so the simple type casting should do, I think.

Change 852274 merged by jenkins-bot:

[mediawiki/extensions/Phonos@master] Engine: cast return value of isPersisted() to bool

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

TheresNoTime claimed this task.
TheresNoTime reassigned this task from TheresNoTime to MusikAnimal.