Page MenuHomePhabricator

TypeError: Illegal offset type
Closed, ResolvedPublicPRODUCTION ERROR

Description

Error
  • mwversion: 1.45.0-wmf.18
  • timestamp: 2025-09-12T03:10:43.303Z
  • phpversion: 8.1.33
  • reqId: 85e4015b-ab93-4d2b-9d3d-228e384c8c60
  • Find reqId in Logstash
normalized_message
[{reqId}] {exception_url}   TypeError: Illegal offset type
FrameLocationCall
from/srv/mediawiki/php-1.45.0-wmf.18/vendor/wikimedia/parsoid/src/Wt2Html/TreeBuilder/TreeBuilderStage.php(172)
#0/srv/mediawiki/php-1.45.0-wmf.18/vendor/wikimedia/parsoid/src/Wt2Html/TreeBuilder/TreeBuilderStage.php(216)Wikimedia\Parsoid\Wt2Html\TreeBuilder\TreeBuilderStage->kvArrToAttr(array)
#1/srv/mediawiki/php-1.45.0-wmf.18/vendor/wikimedia/parsoid/src/Wt2Html/TreeBuilder/TreeBuilderStage.php(131)Wikimedia\Parsoid\Wt2Html\TreeBuilder\TreeBuilderStage->processToken(Wikimedia\Parsoid\Tokens\TagTk)
#2/srv/mediawiki/php-1.45.0-wmf.18/vendor/wikimedia/parsoid/src/Wt2Html/TreeBuilder/TreeBuilderStage.php(265)Wikimedia\Parsoid\Wt2Html\TreeBuilder\TreeBuilderStage->processChunk(array)
#3/srv/mediawiki/php-1.45.0-wmf.18/vendor/wikimedia/parsoid/src/Wt2Html/TreeBuilder/TreeBuilderStage.php(131)Wikimedia\Parsoid\Wt2Html\TreeBuilder\TreeBuilderStage->processToken(Wikimedia\Parsoid\Tokens\EmptyLineTk)
#4/srv/mediawiki/php-1.45.0-wmf.18/vendor/wikimedia/parsoid/src/Wt2Html/TreeBuilder/TreeBuilderStage.php(505)Wikimedia\Parsoid\Wt2Html\TreeBuilder\TreeBuilderStage->processChunk(array)
#5[internal function]Wikimedia\Parsoid\Wt2Html\TreeBuilder\TreeBuilderStage->processChunkily(string, array)
#6/srv/mediawiki/php-1.45.0-wmf.18/vendor/wikimedia/parsoid/src/Wt2Html/DOMProcessorPipeline.php(196)Generator->current()
#7/srv/mediawiki/php-1.45.0-wmf.18/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(164)Wikimedia\Parsoid\Wt2Html\DOMProcessorPipeline->processChunkily(string, array)
#8/srv/mediawiki/php-1.45.0-wmf.18/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipelineFactory.php(619)Wikimedia\Parsoid\Wt2Html\ParserPipeline->parseChunkily(string, array)
#9/srv/mediawiki/php-1.45.0-wmf.18/vendor/wikimedia/parsoid/src/Wikitext/ContentModelHandler.php(187)Wikimedia\Parsoid\Wt2Html\ParserPipelineFactory->parse(string)
#10/srv/mediawiki/php-1.45.0-wmf.18/vendor/wikimedia/parsoid/src/Parsoid.php(198)Wikimedia\Parsoid\Wikitext\ContentModelHandler->toDOM(Wikimedia\Parsoid\Ext\ParsoidExtensionAPI, null)
#11/srv/mediawiki/php-1.45.0-wmf.18/vendor/wikimedia/parsoid/src/Parsoid.php(264)Wikimedia\Parsoid\Parsoid->parseWikitext(MediaWiki\Parser\Parsoid\Config\PageConfig, MediaWiki\Parser\ParserOutput, array, null)
#12/srv/mediawiki/php-1.45.0-wmf.18/includes/parser/Parsoid/ParsoidParser.php(167)Wikimedia\Parsoid\Parsoid->wikitext2html(MediaWiki\Parser\Parsoid\Config\PageConfig, array, null, MediaWiki\Parser\ParserOutput)
#13/srv/mediawiki/php-1.45.0-wmf.18/includes/parser/Parsoid/ParsoidParser.php(295)MediaWiki\Parser\Parsoid\ParsoidParser->genParserOutput(MediaWiki\Parser\Parsoid\Config\PageConfig, MediaWiki\Parser\ParserOptions, MediaWiki\Parser\ParserOutput)
#14/srv/mediawiki/php-1.45.0-wmf.18/includes/content/WikitextContentHandler.php(389)MediaWiki\Parser\Parsoid\ParsoidParser->parse(string, MediaWiki\Title\Title, MediaWiki\Parser\ParserOptions, bool, bool, int, MediaWiki\Parser\ParserOutput)
#15/srv/mediawiki/php-1.45.0-wmf.18/includes/content/ContentHandler.php(1746)MediaWiki\Content\WikitextContentHandler->fillParserOutput(MediaWiki\Content\WikitextContent, MediaWiki\Content\Renderer\ContentParseParams, MediaWiki\Parser\ParserOutput)
#16/srv/mediawiki/php-1.45.0-wmf.18/includes/content/Renderer/ContentRenderer.php(73)MediaWiki\Content\ContentHandler->getParserOutput(MediaWiki\Content\WikitextContent, MediaWiki\Content\Renderer\ContentParseParams)
#17/srv/mediawiki/php-1.45.0-wmf.18/includes/Revision/RenderedRevision.php(261)MediaWiki\Content\Renderer\ContentRenderer->getParserOutput(MediaWiki\Content\WikitextContent, MediaWiki\Page\PageIdentityValue, MediaWiki\Revision\RevisionStoreRecord, MediaWiki\Parser\ParserOptions, array)
#18/srv/mediawiki/php-1.45.0-wmf.18/includes/Revision/RenderedRevision.php(233)MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(MediaWiki\Content\WikitextContent, array)
#19/srv/mediawiki/php-1.45.0-wmf.18/includes/Revision/RevisionRenderer.php(237)MediaWiki\Revision\RenderedRevision->getSlotParserOutput(string, array)
#20/srv/mediawiki/php-1.45.0-wmf.18/includes/Revision/RevisionRenderer.php(170)MediaWiki\Revision\RevisionRenderer->combineSlotOutput(MediaWiki\Revision\RenderedRevision, MediaWiki\Parser\ParserOptions, array)
#21/srv/mediawiki/php-1.45.0-wmf.18/includes/Revision/RenderedRevision.php(196)MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(MediaWiki\Revision\RenderedRevision, array)
#22/srv/mediawiki/php-1.45.0-wmf.18/includes/page/ParserOutputAccess.php(603)MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#23/srv/mediawiki/php-1.45.0-wmf.18/includes/page/ParserOutputAccess.php(516)MediaWiki\Page\ParserOutputAccess->renderRevision(MediaWiki\Page\PageStoreRecord, MediaWiki\Parser\ParserOptions, MediaWiki\Revision\RevisionStoreRecord, array, MediaWiki\Parser\ParserOutput)
#24/srv/mediawiki/php-1.45.0-wmf.18/includes/jobqueue/jobs/ParsoidCachePrewarmJob.php(150)MediaWiki\Page\ParserOutputAccess->getParserOutput(MediaWiki\Page\PageStoreRecord, MediaWiki\Parser\ParserOptions, MediaWiki\Revision\RevisionStoreRecord, array)
#25/srv/mediawiki/php-1.45.0-wmf.18/includes/jobqueue/jobs/ParsoidCachePrewarmJob.php(167)MediaWiki\JobQueue\Jobs\ParsoidCachePrewarmJob->doParsoidCacheUpdate()
#26/srv/mediawiki/php-1.45.0-wmf.18/extensions/EventBus/includes/JobExecutor.php(94)MediaWiki\JobQueue\Jobs\ParsoidCachePrewarmJob->run()
#27/srv/mediawiki/rpc/RunSingleJob.php(60)MediaWiki\Extension\EventBus\JobExecutor->execute(array)
#28{main}
Impact
Notes

Event Timeline

The request url from that original report doesn't help us debug it ... but, there are 5 instances from trwiki which gives us a revision to work with: /w/rest.php/v1/revision/35638399/with_html

ssastry triaged this task as Medium priority.Sep 12 2025, 9:59 PM

There are 380 instances in the last 30 hours since the train rolled out on group 2. So, about 1 every 5 mins. Not a very high volume, but a high enough volume that we should fix this promptly.

The request url from that original report doesn't help us debug it ... but, there are 5 instances from trwiki which gives us a revision to work with: /w/rest.php/v1/revision/35638399/with_html

https://tr.wikipedia.org/wiki/Aln%C4%B1nda_Mavi_Ku%C5%9Flar?useparsoid=1 reliably crashes .. so should be easy to repro and fix.

Can replicate it with this wikitext:

{|
{{1x|1=
{{!}}-
}}{{1x|{{!}}}}
[[Category:Foo]]

I think the new tr-token-gluing supported that landed in this week's train is swallowing the table end tag into the <tr>'s attributes and causing downstream breakage.

Huh ... so, at least source of the breakage is this difference in handling on this simple snippet:

$ echo "{{1x|1=\nx\n}}" | php bin/parse.php --dump tplsrc
[dump] ============================ template source ============================
TEMPLATE:Template:1xTRANSCLUSION:"{{1x|1=\nx\n}}"
--------------------------------------------------------------------------------
x
--------------------------------------------------------------------------------
<p data-parsoid='{"dsr":[0,12,0,0]}'><span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","named":true,"spc":["","","\n","\n"]}]],"dsr":[0,12,null,null]}' data-mw='{"parts":[{"template":{"target":{"wt":"1x","href":"./Template:1x"},"params":{"1":{"wt":"x"}},"i":0}}]}'>x</span></p>

$  echo "{{1x|\nx\n}}" | php bin/parse.php --dump tplsrc
[dump] ============================ template source ============================
TEMPLATE:Template:1xTRANSCLUSION:"{{1x|\nx\n}}"
--------------------------------------------------------------------------------

x

--------------------------------------------------------------------------------

<span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]],"dsr":[0,10,null,null]}' data-mw='{"parts":[{"template":{"target":{"wt":"1x","href":"./Template:1x"},"params":{"1":{"wt":"\nx\n"}},"i":0}}]}'>
</span><p about="#mwt1">x</p><span about="#mwt1">
</span>

So, of course, with a different snippet than the one above, we don't get a crasher!

{|
{{1x|
{{!}}-
}}{{1x|{{!}}}}
[[Category:Foo]]

The output on that is:

<table data-parsoid='{"autoInsertedEnd":true,"dsr":[0,48,2,0]}'>
<tbody about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"dsr":[3,48,0,0],"pi":[[{"k":"1"}],[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"1x","href":"./Template:1x"},"params":{"1":{"wt":"\n{{!}}-\n"}},"i":0}},{"template":{"target":{"wt":"1x","href":"./Template:1x"},"params":{"1":{"wt":"{{!}}"}},"i":1}},"\n[[Category:Foo]]\n"]}'>
<tr>
<td>
<link rel="mw:PageProp/Category" href="./Category:Foo"/></td></tr>
</tbody></table>

So, TSP has to work around the lost newlines when handling token gluing for <tr>s!

But, in any case, TSP's reprocessTokens can mess things up by sucking in td/end-table tokens into its attributes and needs to handle that properly.

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

[mediawiki/services/parsoid@master] WIP: Fix edge-case breakage in TSP

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

Change #1187947 merged by jenkins-bot:

[mediawiki/services/parsoid@master] TSP: Fix edge-case breakage in tr-token-gluing support

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

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

[mediawiki/vendor@master] Bump wikimedia/parsoid to 0.22.0-a22

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

Change #1188397 merged by jenkins-bot:

[mediawiki/vendor@master] Bump wikimedia/parsoid to 0.22.0-a22

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

Change #1188477 had a related patch set uploaded (by Arlolra; author: Arlolra):

[mediawiki/services/parsoid@master] Revert "TSP: Support minimal token gluing for <tr> attributes"

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

Change #1188477 merged by jenkins-bot:

[mediawiki/services/parsoid@master] Revert "TSP: Support minimal token gluing for <tr> attributes"

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

Change #1188482 had a related patch set uploaded (by Arlolra; author: Arlolra):

[mediawiki/vendor@master] Bump wikimedia/parsoid to 0.22.0-a23

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

Change #1188482 merged by jenkins-bot:

[mediawiki/vendor@master] Bump wikimedia/parsoid to 0.22.0-a23

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

Change #1188886 had a related patch set uploaded (by Arlolra; author: Arlolra):

[mediawiki/services/parsoid@master] Reapply "TSP: Support minimal token gluing for <tr> attributes"

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

Change #1188888 had a related patch set uploaded (by Arlolra; author: Arlolra):

[mediawiki/services/parsoid@master] Account for aborted tokens when tr is templated

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

Change #1188886 merged by jenkins-bot:

[mediawiki/services/parsoid@master] Reapply "TSP: Support minimal token gluing for <tr> attributes"

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

Change #1188888 merged by jenkins-bot:

[mediawiki/services/parsoid@master] Account for aborted tokens when tr is templated

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

Change #1190321 had a related patch set uploaded (by Arlolra; author: Arlolra):

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

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

Change #1190321 merged by jenkins-bot:

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

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

Hasn't been seen since deploying 1.45.0-wmf.20