Page MenuHomePhabricator

Score: Call to a member function getExpensiveParserFunctionLimit() on null
Closed, ResolvedPublic

Description

Wikidata Items on beta, for example https://wikidata.beta.wmflabs.org/wiki/Q11 show currently an internal error. It might be related to the Score extension, but it might also be a core issue around MediaWikiServices::getInstance()->getParser().

[Yx79jJ9ld1Ga77jCShzdhwAAAAE] /wiki/Q11 Error: Call to a member function getExpensiveParserFunctionLimit() on null

Backtrace:

from /srv/mediawiki/php-master/includes/parser/Parser.php(4089)
#0 /srv/mediawiki/php-master/extensions/Score/includes/Score.php(295): Parser->incrementExpensiveFunctionCount()
#1 /srv/mediawiki/php-master/extensions/Score/includes/ScoreFormatter.php(87): MediaWiki\Extension\Score\Score::renderScore(string, array, Parser)
#2 /srv/mediawiki/php-master/extensions/Score/includes/ScoreFormatter.php(73): MediaWiki\Extension\Score\ScoreFormatter->formatAsHtml(string)
#3 /srv/mediawiki/php-master/extensions/Wikibase/lib/includes/Formatters/DispatchingValueFormatter.php(75): MediaWiki\Extension\Score\ScoreFormatter->format(DataValues\StringValue)
#4 /srv/mediawiki/php-master/extensions/Wikibase/lib/includes/Formatters/PropertyValueSnakFormatter.php(148): Wikibase\Lib\Formatters\DispatchingValueFormatter->formatValue(DataValues\StringValue, string)
#5 /srv/mediawiki/php-master/extensions/Wikibase/lib/includes/Formatters/PropertyValueSnakFormatter.php(117): Wikibase\Lib\Formatters\PropertyValueSnakFormatter->formatValue(DataValues\StringValue, string)
#6 /srv/mediawiki/php-master/extensions/Wikibase/lib/includes/Formatters/DispatchingSnakFormatter.php(150): Wikibase\Lib\Formatters\PropertyValueSnakFormatter->formatSnak(Wikibase\DataModel\Snak\PropertyValueSnak)
#7 /srv/mediawiki/php-master/extensions/Wikibase/lib/includes/Formatters/ErrorHandlingSnakFormatter.php(68): Wikibase\Lib\Formatters\DispatchingSnakFormatter->formatSnak(Wikibase\DataModel\Snak\PropertyValueSnak)
#8 /srv/mediawiki/php-master/extensions/Wikibase/view/src/SnakHtmlGenerator.php(129): Wikibase\Lib\Formatters\ErrorHandlingSnakFormatter->formatSnak(Wikibase\DataModel\Snak\PropertyValueSnak)
#9 /srv/mediawiki/php-master/extensions/Wikibase/view/src/SnakHtmlGenerator.php(79): Wikibase\View\SnakHtmlGenerator->getFormattedSnakValue(Wikibase\DataModel\Snak\PropertyValueSnak)
#10 /srv/mediawiki/php-master/extensions/Wikibase/view/src/StatementHtmlGenerator.php(183): Wikibase\View\SnakHtmlGenerator->getSnakHtml(Wikibase\DataModel\Snak\PropertyValueSnak, boolean)
#11 /srv/mediawiki/php-master/extensions/Wikibase/view/src/StatementHtmlGenerator.php(162): Wikibase\View\StatementHtmlGenerator->getSnaklistviewHtml(array)
#12 /srv/mediawiki/php-master/extensions/Wikibase/view/src/StatementHtmlGenerator.php(133): Wikibase\View\StatementHtmlGenerator->getHtmlForReference(Wikibase\DataModel\Reference)
#13 /srv/mediawiki/php-master/extensions/Wikibase/view/src/StatementHtmlGenerator.php(88): Wikibase\View\StatementHtmlGenerator->getHtmlForReferences(Wikibase\DataModel\ReferenceList)
#14 /srv/mediawiki/php-master/extensions/Wikibase/view/src/StatementGroupListView.php(163): Wikibase\View\StatementHtmlGenerator->getHtmlForStatement(Wikibase\DataModel\Statement\Statement, string)
#15 /srv/mediawiki/php-master/extensions/Wikibase/view/src/StatementGroupListView.php(145): Wikibase\View\StatementGroupListView->getHtmlForStatementListView(array, string)
#16 /srv/mediawiki/php-master/extensions/Wikibase/view/src/StatementGroupListView.php(75): Wikibase\View\StatementGroupListView->getHtmlForStatementGroupView(array, string)
#17 /srv/mediawiki/php-master/extensions/Wikibase/view/src/StatementSectionsView.php(71): Wikibase\View\StatementGroupListView->getHtml(array)
#18 /srv/mediawiki/php-master/extensions/Wikibase/view/src/ItemView.php(123): Wikibase\View\StatementSectionsView->getHtml(Wikibase\DataModel\Statement\StatementList)
#19 /srv/mediawiki/php-master/extensions/Wikibase/view/src/EntityView.php(56): Wikibase\View\ItemView->getMainHtml(Wikibase\DataModel\Entity\Item)
#20 /srv/mediawiki/php-master/extensions/Wikibase/view/src/ItemView.php(103): Wikibase\View\EntityView->renderEntityView(Wikibase\DataModel\Entity\Item)
#21 /srv/mediawiki/php-master/extensions/Wikibase/repo/includes/ParserOutput/FullEntityParserOutputGenerator.php(162): Wikibase\View\ItemView->getContent(Wikibase\DataModel\Entity\Item, integer)
#22 /srv/mediawiki/php-master/extensions/Wikibase/repo/includes/ParserOutput/FullEntityParserOutputGenerator.php(116): Wikibase\Repo\ParserOutput\FullEntityParserOutputGenerator->addHtmlToParserOutput(ParserOutput, Wikibase\Lib\Store\EntityRevision)
#23 /srv/mediawiki/php-master/extensions/Wikibase/repo/includes/ParserOutput/StatsdTimeRecordingEntityParserOutputGenerator.php(53): Wikibase\Repo\ParserOutput\FullEntityParserOutputGenerator->getParserOutput(Wikibase\Lib\Store\EntityRevision, boolean)
#24 /srv/mediawiki/php-master/extensions/Wikibase/repo/includes/Content/EntityHandler.php(848): Wikibase\Repo\ParserOutput\StatsdTimeRecordingEntityParserOutputGenerator->getParserOutput(Wikibase\Lib\Store\EntityRevision, boolean)
#25 /srv/mediawiki/php-master/extensions/Wikibase/repo/includes/Content/ItemHandler.php(305): Wikibase\Repo\Content\EntityHandler->getParserOutputFromEntityView(Wikibase\Repo\Content\ItemContent, integer, ParserOptions, boolean)
#26 /srv/mediawiki/php-master/extensions/Wikibase/repo/includes/Content/EntityHandler.php(783): Wikibase\Repo\Content\ItemHandler->getParserOutputFromEntityView(Wikibase\Repo\Content\ItemContent, integer, ParserOptions, boolean)
#27 /srv/mediawiki/php-master/includes/content/ContentHandler.php(1721): Wikibase\Repo\Content\EntityHandler->fillParserOutput(Wikibase\Repo\Content\ItemContent, MediaWiki\Content\Renderer\ContentParseParams, ParserOutput)
#28 /srv/mediawiki/php-master/includes/content/Renderer/ContentRenderer.php(47): ContentHandler->getParserOutput(Wikibase\Repo\Content\ItemContent, MediaWiki\Content\Renderer\ContentParseParams)
#29 /srv/mediawiki/php-master/includes/Revision/RenderedRevision.php(266): MediaWiki\Content\Renderer\ContentRenderer->getParserOutput(Wikibase\Repo\Content\ItemContent, Title, integer, ParserOptions, boolean)
#30 /srv/mediawiki/php-master/includes/Revision/RenderedRevision.php(237): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(Wikibase\Repo\Content\ItemContent, boolean)
#31 /srv/mediawiki/php-master/includes/Revision/RevisionRenderer.php(221): MediaWiki\Revision\RenderedRevision->getSlotParserOutput(string, array)
#32 /srv/mediawiki/php-master/includes/Revision/RevisionRenderer.php(158): MediaWiki\Revision\RevisionRenderer->combineSlotOutput(MediaWiki\Revision\RenderedRevision, array)
#33 [internal function]: MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(MediaWiki\Revision\RenderedRevision, array)
#34 /srv/mediawiki/php-master/includes/Revision/RenderedRevision.php(199): call_user_func(Closure, MediaWiki\Revision\RenderedRevision, array)
#35 /srv/mediawiki/php-master/includes/poolcounter/PoolWorkArticleView.php(91): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#36 /srv/mediawiki/php-master/includes/poolcounter/PoolWorkArticleViewCurrent.php(97): PoolWorkArticleView->renderRevision()
#37 /srv/mediawiki/php-master/includes/poolcounter/PoolCounterWork.php(162): PoolWorkArticleViewCurrent->doWork()
#38 /srv/mediawiki/php-master/includes/page/ParserOutputAccess.php(299): PoolCounterWork->execute()
#39 /srv/mediawiki/php-master/includes/page/Article.php(708): MediaWiki\Page\ParserOutputAccess->getParserOutput(WikiPage, ParserOptions, MediaWiki\Revision\RevisionStoreCacheRecord, integer)
#40 /srv/mediawiki/php-master/includes/page/Article.php(522): Article->generateContentOutput(User, ParserOptions, integer, OutputPage, array)
#41 /srv/mediawiki/php-master/extensions/Wikibase/repo/includes/Actions/ViewEntityAction.php(82): Article->view()
#42 /srv/mediawiki/php-master/extensions/Wikibase/repo/includes/Actions/ViewEntityAction.php(57): Wikibase\Repo\Actions\ViewEntityAction->showEntityPage()
#43 /srv/mediawiki/php-master/includes/MediaWiki.php(542): Wikibase\Repo\Actions\ViewEntityAction->show()
#44 /srv/mediawiki/php-master/includes/MediaWiki.php(322): MediaWiki->performAction(Article, Title)
#45 /srv/mediawiki/php-master/includes/MediaWiki.php(904): MediaWiki->performRequest()
#46 /srv/mediawiki/php-master/includes/MediaWiki.php(562): MediaWiki->main()
#47 /srv/mediawiki/php-master/index.php(50): MediaWiki->run()
#48 /srv/mediawiki/php-master/index.php(46): wfIndexMain()
#49 /srv/mediawiki/w/index.php(3): require(string)
#50 {main}

Event Timeline

Probably related to Track score as expensive parser tag hook, which merged after the latest branch cut.

Yeah, this looks suspiciously related. Still doesn't explain why $mOptions in the Parser class in:

includes/parser/Parser.php
	/**
	 * @return bool False if the limit has been exceeded
	 * @since 1.13
	 */
	public function incrementExpensiveFunctionCount() {
		$this->mExpensiveFunctionCount++;
		return $this->mExpensiveFunctionCount <= $this->mOptions->getExpensiveParserFunctionLimit();
	}
Michael renamed this task from Call to a member function getExpensiveParserFunctionLimit() on null to Score: Call to a member function getExpensiveParserFunctionLimit() on null.Sep 12 2022, 10:36 AM
Michael added a project: Editing-team.

I’ll test during the upcoming backport+config window whether this affects production (by manually applying the change on mwdebug); if yes, we should revert that change for now.

Mentioned in SAL (#wikimedia-operations) [2022-09-12T13:35:22Z] <Lucas_WMDE> manually applying [[gerrit:830691]] on mwdebug1001 to test if T317520 affects production (expected to cause getExpensiveParserFunctionLimit-related logstash errors)

Mentioned in SAL (#wikimedia-operations) [2022-09-12T13:40:16Z] <Lucas_WMDE> scap pull on mwdebug1001 to restore good code (confirmed that T317520 affects production)

Confirmed that, if I apply that Score patch on mwdebug, production also has the error (reqId d75406e5-a3d6-4fd6-aecc-b2632e181ee0 in logstash). Train blocker ⇒ UBN; I’ll upload a revert to Gerrit.

Change 831547 had a related patch set uploaded (by Lucas Werkmeister (WMDE); author: Lucas Werkmeister (WMDE)):

[mediawiki/extensions/Score@master] Revert "Track score as expensive parser tag hook"

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

Change 831547 merged by jenkins-bot:

[mediawiki/extensions/Score@master] Revert "Track score as expensive parser tag hook"

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

Lucas_Werkmeister_WMDE claimed this task.
Lucas_Werkmeister_WMDE lowered the priority of this task from Unbreak Now! to High.

I think we can call this resolved as far as the Wikibase issue and train blocker are concerned, though I imagine @Umherirrender and @Jdforrester-WMF will want to retry the overall “score should be counted as expensive” part. (I assume it was motivated by this Wikitech discussion, by the way?) FWIW, I was able to reproduce the bug locally and would be happy to test another patch.

I think we can call this resolved as far as the Wikibase issue and train blocker are concerned,

Thank you! Sorry for the disruption

though I imagine @Umherirrender and @Jdforrester-WMF will want to retry the overall “score should be counted as expensive” part.

Indeed.

(I assume it was motivated by this Wikitech discussion, by the way?)

Yes.

FWIW, I was able to reproduce the bug locally and would be happy to test another patch.

Thank you! I feel that parser options being null is not meant to be a supported state within the Parser, so the 'fix' may be more systemic than inside the Score extension, but thank you for finding the proximate cause and pointing us to the right direction.