Page MenuHomePhabricator

TypeError: Argument 3 passed to Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::moveFosteredAnnotations() must be an instance of Wikimedia\Parsoid\DOM\Element, instance of Wikimedia\Parsoid\DOM\DocumentFragment giv
Closed, ResolvedPublicPRODUCTION ERROR

Description

Error
labels.normalized_message
[{reqId}] {exception_url}   TypeError: Argument 3 passed to Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::moveFosteredAnnotations() must be an instance of Wikimedia\Parsoid\DOM\Element, instance of Wikimedia\Parsoid\DOM\DocumentFragment giv
error.stack_trace
from /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(143)
#0 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(278): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::moveFosteredAnnotations(Wikimedia\Parsoid\DOM\Element, Wikimedia\Parsoid\DOM\Element, Wikimedia\Parsoid\DOM\DocumentFragment, Wikimedia\Parsoid\DOM\Element)
#1 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(303): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\DocumentFragment, Wikimedia\Parsoid\Config\Env)
#2 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(153): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent->run(Wikimedia\Parsoid\Config\Env, Wikimedia\Parsoid\DOM\DocumentFragment, array, boolean)
#3 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(932): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->Wikimedia\Parsoid\Wt2Html\{closure}(Wikimedia\Parsoid\DOM\DocumentFragment, array, boolean)
#4 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(973): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->doPostProcess(Wikimedia\Parsoid\DOM\DocumentFragment)
#5 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(140): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->process(Wikimedia\Parsoid\DOM\DocumentFragment, array)
#6 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Utils/PipelineUtils.php(106): Wikimedia\Parsoid\Wt2Html\ParserPipeline->parse(array, array)
#7 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/TT/DOMFragmentBuilder.php(101): Wikimedia\Parsoid\Utils\PipelineUtils::processContentInPipeline(Wikimedia\Parsoid\Config\Env, Wikimedia\Parsoid\Wt2Html\PageConfigFrame, array, array)
#8 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/TT/DOMFragmentBuilder.php(124): Wikimedia\Parsoid\Wt2Html\TT\DOMFragmentBuilder->buildDOMFragment(Wikimedia\Parsoid\Tokens\SelfclosingTagTk)
#9 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/TT/TokenHandler.php(146): Wikimedia\Parsoid\Wt2Html\TT\DOMFragmentBuilder->onTag(Wikimedia\Parsoid\Tokens\SelfclosingTagTk)
#10 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/TokenTransformManager.php(132): Wikimedia\Parsoid\Wt2Html\TT\TokenHandler->process(array)
#11 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/TokenTransformManager.php(195): Wikimedia\Parsoid\Wt2Html\TokenTransformManager->processChunk(array)
#12 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/TokenTransformManager.php(193): Wikimedia\Parsoid\Wt2Html\TokenTransformManager->processChunkily(string, array)
#13 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/TreeBuilder/TreeBuilderStage.php(488): Wikimedia\Parsoid\Wt2Html\TokenTransformManager->processChunkily(string, array)
#14 [internal function]: Wikimedia\Parsoid\Wt2Html\TreeBuilder\TreeBuilderStage->processChunkily(string, array)
#15 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(987): Generator->current()
#16 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(180): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->processChunkily(string, array)
#17 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipelineFactory.php(293): Wikimedia\Parsoid\Wt2Html\ParserPipeline->parseChunkily(string, array)
#18 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Wikitext/ContentModelHandler.php(164): Wikimedia\Parsoid\Wt2Html\ParserPipelineFactory->parse(string)
#19 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Parsoid.php(199): Wikimedia\Parsoid\Wikitext\ContentModelHandler->toDOM(Wikimedia\Parsoid\Ext\ParsoidExtensionAPI)
#20 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/src/Parsoid.php(240): Wikimedia\Parsoid\Parsoid->parseWikitext(MediaWiki\Parser\Parsoid\Config\PageConfig, ParserOutput, array)
#21 /srv/mediawiki/php-1.42.0-wmf.9/includes/parser/Parsoid/ParsoidParser.php(152): Wikimedia\Parsoid\Parsoid->wikitext2html(MediaWiki\Parser\Parsoid\Config\PageConfig, array, NULL, ParserOutput)
#22 /srv/mediawiki/php-1.42.0-wmf.9/includes/parser/Parsoid/ParsoidParser.php(257): MediaWiki\Parser\Parsoid\ParsoidParser->genParserOutput(MediaWiki\Parser\Parsoid\Config\PageConfig, ParserOptions)
#23 /srv/mediawiki/php-1.42.0-wmf.9/includes/content/WikitextContentHandler.php(396): MediaWiki\Parser\Parsoid\ParsoidParser->parse(string, MediaWiki\Title\Title, ParserOptions, boolean, boolean, integer)
#24 /srv/mediawiki/php-1.42.0-wmf.9/includes/content/ContentHandler.php(1697): WikitextContentHandler->fillParserOutput(WikitextContent, MediaWiki\Content\Renderer\ContentParseParams, ParserOutput)
#25 /srv/mediawiki/php-1.42.0-wmf.9/includes/content/Renderer/ContentRenderer.php(47): ContentHandler->getParserOutput(WikitextContent, MediaWiki\Content\Renderer\ContentParseParams)
#26 /srv/mediawiki/php-1.42.0-wmf.9/includes/Revision/RenderedRevision.php(260): MediaWiki\Content\Renderer\ContentRenderer->getParserOutput(WikitextContent, MediaWiki\Title\Title, integer, ParserOptions, boolean)
#27 /srv/mediawiki/php-1.42.0-wmf.9/includes/Revision/RenderedRevision.php(232): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(WikitextContent, boolean)
#28 /srv/mediawiki/php-1.42.0-wmf.9/includes/Revision/RevisionRenderer.php(226): MediaWiki\Revision\RenderedRevision->getSlotParserOutput(string, array)
#29 /srv/mediawiki/php-1.42.0-wmf.9/includes/Revision/RevisionRenderer.php(164): MediaWiki\Revision\RevisionRenderer->combineSlotOutput(MediaWiki\Revision\RenderedRevision, ParserOptions, array)
#30 [internal function]: MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(MediaWiki\Revision\RenderedRevision, array)
#31 /srv/mediawiki/php-1.42.0-wmf.9/includes/Revision/RenderedRevision.php(199): call_user_func(Closure, MediaWiki\Revision\RenderedRevision, array)
#32 /srv/mediawiki/php-1.42.0-wmf.9/includes/poolcounter/PoolWorkArticleView.php(84): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#33 /srv/mediawiki/php-1.42.0-wmf.9/includes/poolcounter/PoolWorkArticleViewCurrent.php(104): PoolWorkArticleView->renderRevision()
#34 /srv/mediawiki/php-1.42.0-wmf.9/includes/poolcounter/PoolCounterWork.php(167): PoolWorkArticleViewCurrent->doWork()
#35 /srv/mediawiki/php-1.42.0-wmf.9/includes/page/ParserOutputAccess.php(307): PoolCounterWork->execute()
#36 /srv/mediawiki/php-1.42.0-wmf.9/includes/parser/Parsoid/ParsoidOutputAccess.php(197): MediaWiki\Page\ParserOutputAccess->getParserOutput(MediaWiki\Page\PageStoreRecord, ParserOptions, MediaWiki\Revision\RevisionStoreRecord, integer)
#37 /srv/mediawiki/php-1.42.0-wmf.9/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(756): MediaWiki\Parser\Parsoid\ParsoidOutputAccess->getParserOutput(MediaWiki\Page\PageStoreRecord, ParserOptions, MediaWiki\Revision\RevisionStoreRecord, integer, boolean)
#38 /srv/mediawiki/php-1.42.0-wmf.9/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(564): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getParserOutputInternal(ParserOptions)
#39 /srv/mediawiki/php-1.42.0-wmf.9/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(660): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getParserOutput()
#40 /srv/mediawiki/php-1.42.0-wmf.9/includes/Rest/Handler/ParsoidHandler.php(741): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getPageBundle()
#41 /srv/mediawiki/php-1.42.0-wmf.9/vendor/wikimedia/parsoid/extension/src/Rest/Handler/PageHandler.php(92): MediaWiki\Rest\Handler\ParsoidHandler->wt2html(MediaWiki\Parser\Parsoid\Config\PageConfig, array)
#42 /srv/mediawiki/php-1.42.0-wmf.9/includes/Rest/Router.php(561): MWParsoid\Rest\Handler\PageHandler->execute()
#43 /srv/mediawiki/php-1.42.0-wmf.9/includes/Rest/Router.php(452): MediaWiki\Rest\Router->executeHandler(MWParsoid\Rest\Handler\PageHandler)
#44 /srv/mediawiki/php-1.42.0-wmf.9/includes/Rest/EntryPoint.php(195): MediaWiki\Rest\Router->execute(MediaWiki\Rest\RequestFromGlobals)
#45 /srv/mediawiki/php-1.42.0-wmf.9/includes/Rest/EntryPoint.php(135): MediaWiki\Rest\EntryPoint->execute()
#46 /srv/mediawiki/php-1.42.0-wmf.9/rest.php(31): MediaWiki\Rest\EntryPoint::main()
#47 /srv/mediawiki/w/rest.php(3): require(string)
#48 {main}
Impact
Notes

30 of these, all enwikivoyage, in 1.42.0-wmf.9 (T350085).

Details

Request URL
https://en.wikivoyage.org/w/rest.php/en.wikivoyage.org/v3/page/pagebundle/Australia/4788195
Related Changes in Gerrit:

Event Timeline

Change 982950 had a related patch set uploaded (by Subramanya Sastry; author: Subramanya Sastry):

[mediawiki/services/parsoid@master] MarkfosteredContent: Relax type to let DocumentFragments through

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

This is caused by tables that have fosterable content that are produced by templates that in turn are directly (i.e. not as children of other nodes) embedded as captions of image thumbs.

Here is a test case to reproduce this that meets all those conditions

[[File:Foo.jpg|thumb|450px|
{|
{{1x|<div>foo</div>}}
|}
]]

The image on the right in https://en.wikivoyage.org/wiki/Australia#Get_in with color-coded visa information is the image on that page that is causing this error to trigger.

Besides this page on enwikivoyage, looks like a bunch of pages on eswikisource are also triggering this.

With any luck, with group2 rollout, this error will be restricted to a handful of pages and we can get this fixed on next week's train. The logs may still be noisy (and spiky) if these pages are retried or old revisions are fetched. Or, we figure out a process for how to do backports for Parsoid fixes (since it is a library that goes through vendor) and is not a straightforward backport deploy.

Any easy fix to suppress the noise is to fix the error on some of these pages -- here is one on the enwikivoyage:Austtralia page.

Looks on eswikisource, this is caused by some version of this snippet:

<poem>
{|

|-
|foo
|}
</poem>

Normally whitspace and empty lines in fosterable positions in tables wouldn't be fosterable but <poem> does special reprocessing and adds <br> tags to all lines which converts what was an empty line into a fosterable <br> tag!

Anyway, the patch in gerrit will suppress this error --- but I was just exploring why / how this error was being triggered and what kind of page edits can eliminate these errors.

MSantos triaged this task as High priority.Dec 14 2023, 3:17 PM

Change 982950 merged by jenkins-bot:

[mediawiki/services/parsoid@master] MarkfosteredContent: Relax type to let DocumentFragments through

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

With any luck, with group2 rollout, this error will be restricted to a handful of pages and we can get this fixed on next week's train. The logs may still be noisy (and spiky) if these pages are retried or old revisions are fetched. Or, we figure out a process for how to do backports for Parsoid fixes (since it is a library that goes through vendor) and is not a straightforward backport deploy.

Ok - since there's a fix on master, I won't treat this as a blocker unless log noise spikes substantially on group2.

Mentioned in SAL (#wikimedia-operations) [2023-12-14T19:03:34Z] <brennen> 1.42.0-wmf.9 (T350085) status: no current blockers, although we should keep an eye on T353400. rolling to all wikis.

ssastry claimed this task.

Look at Parsoid's logstash error panel, we have had about 2500 entries since group1 rollout and lot are duplicates either for old versions of the page or retries or requests from different clients. Analyzing the logstash data, I found about 17 pages from non-eswikisouce, and about 100 pages from eswikisource. Of the 17, about 6 are user pages on frwiki and I fixed up 2 pages earlier (one enwikivoyage, and one srwiki). Since the primary user impact is that VE will error out on these pages, since it is just 11 wikipedia pages (I don't know how commonly VE is used on es wikisource), I think we can let this be handled on the next train as we originally planned. I did this analysis just to learn a bunch of things about logstash and also to satisfy myself that our chosen course of action is justifiable. As part of this ticket, we also seem to have resolved that we Parsoid vendor backports aren't that hard. So, all said and done, in the future, we may just decide to do a vendor backport as the simpler course of action for Parsoid error spikes.

I am going to mark this resolved for now.

Change 983902 had a related patch set uploaded (by Subramanya Sastry; author: Subramanya Sastry):

[mediawiki/vendor@master] Bump wikimedia/parsoid to 0.19.0-a9

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

Change 983902 merged by jenkins-bot:

[mediawiki/vendor@master] Bump wikimedia/parsoid to 0.19.0-a9

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