Page MenuHomePhabricator

Introduce parser limit for # of images
Open, LowPublicPRODUCTION ERROR

Description

Error
normalized_message
[{reqId}] {exception_url}   PHP Warning: Wikimedia\RequestTimeout\RequestTimeoutException: The maximum execution time of 60 seconds was exceeded
exception.trace
from /srv/mediawiki/src/Profiler.php(342)
#0 [internal function]: MWExceptionHandler::handleError(integer, string, string, integer, array)
#1 /srv/mediawiki/src/Profiler.php(342): trigger_error(string, integer)
#2 /srv/mediawiki/src/Profiler.php(241): Wikimedia\MWConfig\Profiler::excimerFlushToArclamp(array, array, string)
#3 /srv/mediawiki/php-1.41.0-wmf.28/includes/libs/objectcache/MemcachedPeclBagOStuff.php(360): Wikimedia\MWConfig\Profiler::Wikimedia\MWConfig\{closure}(ExcimerLog)
#4 /srv/mediawiki/php-1.41.0-wmf.28/includes/libs/objectcache/MediumSpecificBagOStuff.php(667): MemcachedPeclBagOStuff->doGetMulti(array, integer)
#5 /srv/mediawiki/php-1.41.0-wmf.28/includes/libs/objectcache/wancache/WANObjectCache.php(568): MediumSpecificBagOStuff->getMulti(array)
#6 /srv/mediawiki/php-1.41.0-wmf.28/includes/libs/objectcache/wancache/WANObjectCache.php(1608): WANObjectCache->fetchKeys(array, array, NULL)
#7 /srv/mediawiki/php-1.41.0-wmf.28/includes/libs/objectcache/wancache/WANObjectCache.php(1556): WANObjectCache->fetchOrRegenerate(string, integer, Closure, array, array)
#8 /srv/mediawiki/php-1.41.0-wmf.28/includes/filerepo/file/LocalFile.php(386): WANObjectCache->getWithSetCallback(string, integer, Closure, array)
#9 /srv/mediawiki/php-1.41.0-wmf.28/includes/filerepo/file/LocalFile.php(677): LocalFile->loadFromCache()
#10 /srv/mediawiki/php-1.41.0-wmf.28/includes/filerepo/FileRepo.php(479): LocalFile->load(integer)
#11 /srv/mediawiki/php-1.41.0-wmf.28/includes/filerepo/RepoGroup.php(140): FileRepo->findFile(MediaWiki\Title\Title, array)
#12 /srv/mediawiki/php-1.41.0-wmf.28/includes/page/File/BadFileLookup.php(71): RepoGroup->findFile(MediaWiki\Title\Title)
#13 /srv/mediawiki/php-1.41.0-wmf.28/includes/parser/Parsoid/Config/DataAccess.php(265): MediaWiki\Page\File\BadFileLookup->isBadFile(string, MediaWiki\Title\Title)
#14 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/AddMediaInfo.php(707): MediaWiki\Parser\Parsoid\Config\DataAccess->getFileInfo(MediaWiki\Parser\Parsoid\Config\PageConfig, array)
#15 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(157): Wikimedia\Parsoid\Wt2Html\PP\Processors\AddMediaInfo->run(Wikimedia\Parsoid\Config\Env, Wikimedia\Parsoid\DOM\DocumentFragment, array, boolean)
#16 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(933): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->Wikimedia\Parsoid\Wt2Html\{closure}(Wikimedia\Parsoid\DOM\DocumentFragment, array, boolean)
#17 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(974): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->doPostProcess(Wikimedia\Parsoid\DOM\DocumentFragment)
#18 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(140): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->process(Wikimedia\Parsoid\DOM\DocumentFragment, array)
#19 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Utils/PipelineUtils.php(106): Wikimedia\Parsoid\Wt2Html\ParserPipeline->parse(string, array)
#20 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Ext/ParsoidExtensionAPI.php(397): Wikimedia\Parsoid\Utils\PipelineUtils::processContentInPipeline(Wikimedia\Parsoid\Config\Env, Wikimedia\Parsoid\Wt2Html\Frame, string, array)
#21 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Ext/ParsoidExtensionAPI.php(978): Wikimedia\Parsoid\Ext\ParsoidExtensionAPI->wikitextToDOM(string, array, boolean)
#22 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Ext/Gallery/Gallery.php(139): Wikimedia\Parsoid\Ext\ParsoidExtensionAPI->renderMedia(string, array, NULL, boolean, boolean)
#23 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Ext/Gallery/Gallery.php(215): Wikimedia\Parsoid\Ext\Gallery\Gallery::pLine(Wikimedia\Parsoid\Ext\ParsoidExtensionAPI, string, integer, Wikimedia\Parsoid\Ext\Gallery\Opts)
#24 [internal function]: Wikimedia\Parsoid\Ext\Gallery\Gallery->Wikimedia\Parsoid\Ext\Gallery\{closure}(array)
#25 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Ext/Gallery/Gallery.php(213): array_map(Closure, array)
#26 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/TT/ExtensionHandler.php(97): Wikimedia\Parsoid\Ext\Gallery\Gallery->sourceToDom(Wikimedia\Parsoid\Ext\ParsoidExtensionAPI, string, array)
#27 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/TT/ExtensionHandler.php(277): Wikimedia\Parsoid\Wt2Html\TT\ExtensionHandler->onExtension(Wikimedia\Parsoid\Tokens\SelfclosingTagTk)
#28 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/TT/TokenHandler.php(150): Wikimedia\Parsoid\Wt2Html\TT\ExtensionHandler->onTag(Wikimedia\Parsoid\Tokens\SelfclosingTagTk)
#29 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/TokenTransformManager.php(132): Wikimedia\Parsoid\Wt2Html\TT\TokenHandler->process(array)
#30 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/TokenTransformManager.php(195): Wikimedia\Parsoid\Wt2Html\TokenTransformManager->processChunk(array)
#31 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/TokenTransformManager.php(193): Wikimedia\Parsoid\Wt2Html\TokenTransformManager->processChunkily(string, array)
#32 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/TreeBuilder/TreeBuilderStage.php(489): Wikimedia\Parsoid\Wt2Html\TokenTransformManager->processChunkily(string, array)
#33 [internal function]: Wikimedia\Parsoid\Wt2Html\TreeBuilder\TreeBuilderStage->processChunkily(string, array)
#34 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(988): Generator->current()
#35 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(180): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->processChunkily(string, array)
#36 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipelineFactory.php(299): Wikimedia\Parsoid\Wt2Html\ParserPipeline->parseChunkily(string, array)
#37 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Wikitext/ContentModelHandler.php(164): Wikimedia\Parsoid\Wt2Html\ParserPipelineFactory->parse(string)
#38 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Parsoid.php(196): Wikimedia\Parsoid\Wikitext\ContentModelHandler->toDOM(Wikimedia\Parsoid\Ext\ParsoidExtensionAPI)
#39 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/src/Parsoid.php(236): Wikimedia\Parsoid\Parsoid->parseWikitext(MediaWiki\Parser\Parsoid\Config\PageConfig, ParserOutput, array)
#40 /srv/mediawiki/php-1.41.0-wmf.28/includes/parser/Parsoid/ParsoidOutputAccess.php(301): Wikimedia\Parsoid\Parsoid->wikitext2html(MediaWiki\Parser\Parsoid\Config\PageConfig, array, NULL, ParserOutput)
#41 /srv/mediawiki/php-1.41.0-wmf.28/includes/parser/Parsoid/ParsoidOutputAccess.php(478): MediaWiki\Parser\Parsoid\ParsoidOutputAccess->parseInternal(MediaWiki\Parser\Parsoid\Config\PageConfig, array)
#42 /srv/mediawiki/php-1.41.0-wmf.28/includes/parser/Parsoid/ParsoidOutputAccess.php(243): MediaWiki\Parser\Parsoid\ParsoidOutputAccess->parse(MediaWiki\Page\PageStoreRecord, ParserOptions, array, MediaWiki\Revision\RevisionStoreRecord)
#43 /srv/mediawiki/php-1.41.0-wmf.28/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(746): MediaWiki\Parser\Parsoid\ParsoidOutputAccess->getParserOutput(MediaWiki\Page\PageStoreRecord, ParserOptions, MediaWiki\Revision\RevisionStoreRecord, integer)
#44 /srv/mediawiki/php-1.41.0-wmf.28/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(574): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getParserOutputInternal(ParserOptions)
#45 /srv/mediawiki/php-1.41.0-wmf.28/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(670): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getParserOutput()
#46 /srv/mediawiki/php-1.41.0-wmf.28/includes/Rest/Handler/ParsoidHandler.php(887): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getPageBundle()
#47 /srv/mediawiki/php-1.41.0-wmf.28/vendor/wikimedia/parsoid/extension/src/Rest/Handler/PageHandler.php(92): MediaWiki\Rest\Handler\ParsoidHandler->wt2html(MediaWiki\Parser\Parsoid\Config\PageConfig, array)
#48 /srv/mediawiki/php-1.41.0-wmf.28/includes/Rest/Router.php(517): MWParsoid\Rest\Handler\PageHandler->execute()
#49 /srv/mediawiki/php-1.41.0-wmf.28/includes/Rest/Router.php(422): MediaWiki\Rest\Router->executeHandler(MWParsoid\Rest\Handler\PageHandler)
#50 /srv/mediawiki/php-1.41.0-wmf.28/includes/Rest/EntryPoint.php(195): MediaWiki\Rest\Router->execute(MediaWiki\Rest\RequestFromGlobals)
#51 /srv/mediawiki/php-1.41.0-wmf.28/includes/Rest/EntryPoint.php(135): MediaWiki\Rest\EntryPoint->execute()
#52 /srv/mediawiki/php-1.41.0-wmf.28/rest.php(31): MediaWiki\Rest\EntryPoint::main()
#53 /srv/mediawiki/w/rest.php(3): require(string)
#54 {main}
Impact

Minimal impact (just 1 instance in the last hour) on Commons.

Notes

Event Timeline

Restricted Application added a subscriber: Aklapper. · View Herald Transcript
Tgr renamed this task from Profiler: PHP Warning: Wikimedia\RequestTimeout\RequestTimeoutException to Timeout in Parsoid DOMPostProcessor on User:Jpbazard/gallery.Oct 8 2023, 4:45 AM
Tgr renamed this task from Timeout in Parsoid DOMPostProcessor on User:Jpbazard/gallery to Timeout in Parsoid DOMPostProcessor on commons:User:Jpbazard/gallery.
Tgr subscribed.

That page has almost 3000 sections. Probably over 10K images. Maybe there should be a parser limit for images.

Tagging Content-Transform, but I assume timeout is the expected behavior for something like this.

MSantos subscribed.

From the backlog grooming meeting: We should consider a different resource limit config for commons.

Changing priority to low because we still need to have a strategy for long-tail of large pages.

cscott renamed this task from Timeout in Parsoid DOMPostProcessor on commons:User:Jpbazard/gallery to Introduce parser limit for # of images.May 22 2025, 6:05 PM
cscott moved this task from Performance to Feature requests on the Parsoid board.

Next steps:

  • What should the limit be?
  • With the limited defined, define how we are enforcing it.

Change #1226332 had a related patch set uploaded (by C. Scott Ananian; author: C. Scott Ananian):

[mediawiki/core@master] Add ParserOutputFlags::PREVENT_SELECTIVE_UPDATE

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

Change #1227449 had a related patch set uploaded (by C. Scott Ananian; author: C. Scott Ananian):

[mediawiki/services/parsoid@master] Set 'prevent-selective-update' when conflicting metadata is set

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

Change #1226332 merged by jenkins-bot:

[mediawiki/core@master] Add ParserOutputFlags::PREVENT_SELECTIVE_UPDATE

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

Change #1239855 had a related patch set uploaded (by C. Scott Ananian; author: C. Scott Ananian):

[mediawiki/core@wmf/1.46.0-wmf.16] Add ParserOutputFlags::PREVENT_SELECTIVE_UPDATE

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

Change #1239855 merged by jenkins-bot:

[mediawiki/core@wmf/1.46.0-wmf.16] Add ParserOutputFlags::PREVENT_SELECTIVE_UPDATE

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

Mentioned in SAL (#wikimedia-operations) [2026-02-17T14:08:00Z] <ladsgroup@deploy2002> Started scap sync-world: Backport for [[gerrit:1239855|Add ParserOutputFlags::PREVENT_SELECTIVE_UPDATE (T348236)]]

Mentioned in SAL (#wikimedia-operations) [2026-02-17T14:10:08Z] <ladsgroup@deploy2002> ladsgroup, cscott: Backport for [[gerrit:1239855|Add ParserOutputFlags::PREVENT_SELECTIVE_UPDATE (T348236)]] synced to the testservers (see https://wikitech.wikimedia.org/wiki/Mwdebug). Changes can now be verified there.

Mentioned in SAL (#wikimedia-operations) [2026-02-17T14:16:14Z] <ladsgroup@deploy2002> Finished scap sync-world: Backport for [[gerrit:1239855|Add ParserOutputFlags::PREVENT_SELECTIVE_UPDATE (T348236)]] (duration: 08m 13s)

Change #1227449 merged by jenkins-bot:

[mediawiki/services/parsoid@master] Set 'prevent-selective-update' when conflicting metadata is set

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

Change #1264672 had a related patch set uploaded (by Isabelle Hurbain-Palatin; author: Isabelle Hurbain-Palatin):

[mediawiki/vendor@master] Bump wikimedia/parsoid to 0.23.0-a24

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

Change #1264672 merged by jenkins-bot:

[mediawiki/vendor@master] Bump wikimedia/parsoid to 0.23.0-a24

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

Change #1275427 had a related patch set uploaded (by OSleger; author: OSleger):

[mediawiki/services/parsoid@master] AddMediaInfo: Limit number of rendered media

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