Page MenuHomePhabricator

Wikimedia\Assert\InvariantException: Invariant failed: Bad UTF-8 at end of string (2 byte sequence)
Open, Needs TriagePublicPRODUCTION ERROR

Description

Error
normalized_message
[{reqId}] {exception_url}   Wikimedia\Assert\InvariantException: Invariant failed: Bad UTF-8 at end of string (2 byte sequence)
exception.trace
from /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/assert/src/Assert.php(231)
#0 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Utils/PHPUtils.php(199): Wikimedia\Assert\Assert::invariant(boolean, string)
#1 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/DOMRangeBuilder.php(986): Wikimedia\Parsoid\Utils\PHPUtils::safeSubstr(string, integer, integer)
#2 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/DOMRangeBuilder.php(1303): Wikimedia\Parsoid\Wt2Html\PP\Processors\DOMRangeBuilder->encapsulateTemplates(array)
#3 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/WrapTemplates.php(21): Wikimedia\Parsoid\Wt2Html\PP\Processors\DOMRangeBuilder->execute(Wikimedia\Parsoid\DOM\Element)
#4 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(157): Wikimedia\Parsoid\Wt2Html\PP\Processors\WrapTemplates->run(Wikimedia\Parsoid\Config\Env, Wikimedia\Parsoid\DOM\Element, array, boolean)
#5 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(868): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->Wikimedia\Parsoid\Wt2Html\{closure}(Wikimedia\Parsoid\DOM\Element, array, boolean)
#6 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(909): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->doPostProcess(Wikimedia\Parsoid\DOM\Element)
#7 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(927): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->process(Wikimedia\Parsoid\DOM\Element)
#8 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(180): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->processChunkily(string, array)
#9 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipelineFactory.php(299): Wikimedia\Parsoid\Wt2Html\ParserPipeline->parseChunkily(string, array)
#10 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Wikitext/ContentModelHandler.php(124): Wikimedia\Parsoid\Wt2Html\ParserPipelineFactory->parse(string)
#11 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Parsoid.php(173): Wikimedia\Parsoid\Wikitext\ContentModelHandler->toDOM(Wikimedia\Parsoid\Ext\ParsoidExtensionAPI)
#12 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/src/Parsoid.php(215): Wikimedia\Parsoid\Parsoid->parseWikitext(MediaWiki\Parser\Parsoid\Config\PageConfig, Wikimedia\Parsoid\Config\StubMetadataCollector, array)
#13 /srv/mediawiki/php-1.40.0-wmf.14/includes/parser/Parsoid/ParsoidOutputAccess.php(277): Wikimedia\Parsoid\Parsoid->wikitext2html(MediaWiki\Parser\Parsoid\Config\PageConfig, array)
#14 /srv/mediawiki/php-1.40.0-wmf.14/includes/parser/Parsoid/ParsoidOutputAccess.php(433): MediaWiki\Parser\Parsoid\ParsoidOutputAccess->parseInternal(MediaWiki\Parser\Parsoid\Config\PageConfig, array)
#15 /srv/mediawiki/php-1.40.0-wmf.14/includes/parser/Parsoid/ParsoidOutputAccess.php(223): MediaWiki\Parser\Parsoid\ParsoidOutputAccess->parse(MediaWiki\Page\PageStoreRecord, ParserOptions, array, MediaWiki\Revision\RevisionStoreRecord)
#16 /srv/mediawiki/php-1.40.0-wmf.14/includes/Rest/Handler/HtmlOutputRendererHelper.php(542): MediaWiki\Parser\Parsoid\ParsoidOutputAccess->getParserOutput(MediaWiki\Page\PageStoreRecord, ParserOptions, MediaWiki\Revision\RevisionStoreRecord, integer)
#17 /srv/mediawiki/php-1.40.0-wmf.14/includes/Rest/Handler/HtmlOutputRendererHelper.php(642): MediaWiki\Rest\Handler\HtmlOutputRendererHelper->getParserOutput()
#18 /srv/mediawiki/php-1.40.0-wmf.14/includes/Rest/Handler/ParsoidHandler.php(873): MediaWiki\Rest\Handler\HtmlOutputRendererHelper->getPageBundle()
#19 /srv/mediawiki/php-1.40.0-wmf.14/vendor/wikimedia/parsoid/extension/src/Rest/Handler/PageHandler.php(92): MediaWiki\Rest\Handler\ParsoidHandler->wt2html(MediaWiki\Parser\Parsoid\Config\PageConfig, array)
#20 /srv/mediawiki/php-1.40.0-wmf.14/includes/Rest/Router.php(487): MWParsoid\Rest\Handler\PageHandler->execute()
#21 /srv/mediawiki/php-1.40.0-wmf.14/includes/Rest/Router.php(406): MediaWiki\Rest\Router->executeHandler(MWParsoid\Rest\Handler\PageHandler)
#22 /srv/mediawiki/php-1.40.0-wmf.14/includes/Rest/EntryPoint.php(191): MediaWiki\Rest\Router->execute(MediaWiki\Rest\RequestFromGlobals)
#23 /srv/mediawiki/php-1.40.0-wmf.14/includes/Rest/EntryPoint.php(131): MediaWiki\Rest\EntryPoint->execute()
#24 /srv/mediawiki/php-1.40.0-wmf.14/rest.php(31): MediaWiki\Rest\EntryPoint::main()
#25 /srv/mediawiki/w/rest.php(3): require(string)
#26 {main}
Impact
Notes

Details

Request URL
https://ar.wikipedia.org/w/rest.php/ar.wikipedia.org/v3/page/pagebundle/%D9%88%D9%8A%D9%83%D9%8A%D8%A8%D9%8A%D8%AF%D9%8A%D8%A7%3A%D9%85%D9%84%D8%B9%D8%A8/60179153

Event Timeline

Still happening as of 1.40.0-wmf.25, with 11,349 instances in the last 90 days:

Screenshot from 2023-03-03 11-35-48.png (203×943 px, 20 KB)

Added filter to the MW new errors board.

A fresh stack trace from 1.40.0-wmf.27

Error
normalized_message
[{reqId}] {exception_url}   Wikimedia\Assert\InvariantException: Invariant failed: Bad UTF-8 at start of string
exception.trace
from /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/assert/src/Assert.php(231)
#0 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Utils/PHPUtils.php(177): Wikimedia\Assert\Assert::invariant(boolean, string)
#1 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Tokens/SourceRange.php(82): Wikimedia\Parsoid\Utils\PHPUtils::safeSubstr(string, integer, integer)
#2 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/DOMRangeBuilder.php(1070): Wikimedia\Parsoid\Tokens\SourceRange->substr(string)
#3 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/DOMRangeBuilder.php(1303): Wikimedia\Parsoid\Wt2Html\PP\Processors\DOMRangeBuilder->encapsulateTemplates(array)
#4 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/WrapTemplates.php(21): Wikimedia\Parsoid\Wt2Html\PP\Processors\DOMRangeBuilder->execute(Wikimedia\Parsoid\DOM\Element)
#5 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(157): Wikimedia\Parsoid\Wt2Html\PP\Processors\WrapTemplates->run(Wikimedia\Parsoid\Config\Env, Wikimedia\Parsoid\DOM\Element, array, boolean)
#6 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(868): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->Wikimedia\Parsoid\Wt2Html\{closure}(Wikimedia\Parsoid\DOM\Element, array, boolean)
#7 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(909): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->doPostProcess(Wikimedia\Parsoid\DOM\Element)
#8 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(927): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->process(Wikimedia\Parsoid\DOM\Element)
#9 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(180): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->processChunkily(string, array)
#10 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipelineFactory.php(299): Wikimedia\Parsoid\Wt2Html\ParserPipeline->parseChunkily(string, array)
#11 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Wikitext/ContentModelHandler.php(128): Wikimedia\Parsoid\Wt2Html\ParserPipelineFactory->parse(string)
#12 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Parsoid.php(174): Wikimedia\Parsoid\Wikitext\ContentModelHandler->toDOM(Wikimedia\Parsoid\Ext\ParsoidExtensionAPI)
#13 /srv/mediawiki/php-1.40.0-wmf.27/vendor/wikimedia/parsoid/src/Parsoid.php(216): Wikimedia\Parsoid\Parsoid->parseWikitext(MediaWiki\Parser\Parsoid\Config\PageConfig, ParserOutput, array)
#14 /srv/mediawiki/php-1.40.0-wmf.27/includes/parser/Parsoid/ParsoidOutputAccess.php(298): Wikimedia\Parsoid\Parsoid->wikitext2html(MediaWiki\Parser\Parsoid\Config\PageConfig, array, NULL, ParserOutput)
#15 /srv/mediawiki/php-1.40.0-wmf.27/includes/parser/Parsoid/ParsoidOutputAccess.php(465): MediaWiki\Parser\Parsoid\ParsoidOutputAccess->parseInternal(MediaWiki\Parser\Parsoid\Config\PageConfig, array)
#16 /srv/mediawiki/php-1.40.0-wmf.27/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(715): MediaWiki\Parser\Parsoid\ParsoidOutputAccess->parse(MediaWiki\Page\PageStoreRecord, ParserOptions, array, MediaWiki\Revision\MutableRevisionRecord)
#17 /srv/mediawiki/php-1.40.0-wmf.27/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(532): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getParserOutputInternal(ParserOptions)
#18 /srv/mediawiki/php-1.40.0-wmf.27/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(628): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getParserOutput()
#19 /srv/mediawiki/php-1.40.0-wmf.27/includes/Rest/Handler/ParsoidHandler.php(913): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getPageBundle()
#20 /srv/mediawiki/php-1.40.0-wmf.27/includes/Rest/Handler/TransformHandler.php(132): MediaWiki\Rest\Handler\ParsoidHandler->wt2html(MediaWiki\Parser\Parsoid\Config\PageConfig, array, string)
#21 /srv/mediawiki/php-1.40.0-wmf.27/includes/Rest/Router.php(515): MediaWiki\Rest\Handler\TransformHandler->execute()
#22 /srv/mediawiki/php-1.40.0-wmf.27/includes/Rest/Router.php(421): MediaWiki\Rest\Router->executeHandler(MWParsoid\Rest\Handler\TransformHandler)
#23 /srv/mediawiki/php-1.40.0-wmf.27/includes/Rest/EntryPoint.php(195): MediaWiki\Rest\Router->execute(MediaWiki\Rest\RequestFromGlobals)
#24 /srv/mediawiki/php-1.40.0-wmf.27/includes/Rest/EntryPoint.php(135): MediaWiki\Rest\EntryPoint->execute()
#25 /srv/mediawiki/php-1.40.0-wmf.27/rest.php(31): MediaWiki\Rest\EntryPoint::main()
#26 /srv/mediawiki/w/rest.php(3): require(string)
#27 {main}

The only utf-8 ones left now have always been for "Main Page" of ukwiki, ruwiki, bewiki. That indicates someone is POSTing some wikitext to the API which makes it harder to debug without having access to the wikitext in question. We have been ignoring this in the Parsoid logstash for a while now as possibly user error. But, maybe we should dump the wikitext being POSTed and see if we can figure out if it is an issue in Parsoid. But, need to figure out what the best way to do this is since the POSTed wikitext could be large blobs.

That is still happening. Over the last four weeks all exceptions came from Main_Page for ruwiki, ukwiki and some very few from bewiki (Belarusian) and viwiki (Vietnamese).

Maybe the Wikimedia\Assert\InvariantException exception could be caught and the Parser might try to log the last few bytes of the invalid string? Then it does not look like the offset is given and we probably don't want to log the full posted wikitext.