As seen in Logstash under mediawiki-errors for "Recursion detected", via https://logstash.wikimedia.org/goto/415180e45258ab2afdf73972a796d9fe.
Since MediaWiki 1.31.0-wmf.6, on at least ru.wikipedia.org and zh.wikipedia.org:
[{exception_id}] {exception_url} ErrorException from line 319 of /srv/mediawiki/php-1.32.0-wmf.13/includes/context/RequestContext.php: PHP Warning: Recursion detected in RequestContext::getLanguage
Recursion detected: #0 /srv/mediawiki/php-1.32.0-wmf.13/includes/Message.php(380): RequestContext->getLanguage() #1 /srv/mediawiki/php-1.32.0-wmf.13/includes/Message.php(1297): Message->getLanguage() #2 /srv/mediawiki/php-1.32.0-wmf.13/includes/Message.php(849): Message->fetchMessage() #3 /srv/mediawiki/php-1.32.0-wmf.13/includes/Message.php(953): Message->toString() #4 /srv/mediawiki/php-1.32.0-wmf.13/includes/user/User.php(1888): Message->plain() #5 /srv/mediawiki/php-1.32.0-wmf.13/includes/user/User.php(2274): User->getBlockedStatus() #6 /srv/mediawiki/php-1.32.0-wmf.13/includes/user/User.php(2264): User->getBlock() #7 /srv/mediawiki/php-1.32.0-wmf.13/includes/user/User.php(1370): User->isBlocked() #8 /srv/mediawiki/php-1.32.0-wmf.13/includes/user/User.php(443): User->loadFromSession() #9 /srv/mediawiki/php-1.32.0-wmf.13/includes/user/User.php(5456): User->load() #10 /srv/mediawiki/php-1.32.0-wmf.13/includes/user/User.php(3146): User->loadOptions() #11 /srv/mediawiki/php-1.32.0-wmf.13/includes/context/RequestContext.php(336): User->getOption() #12 /srv/mediawiki/php-1.32.0-wmf.13/includes/StubObject.php(206): RequestContext->getLanguage() #13 /srv/mediawiki/php-1.32.0-wmf.13/includes/StubObject.php(168): StubUserLang->_newObject() #14 /srv/mediawiki/php-1.32.0-wmf.13/includes/parser/ParserOptions.php(956): StubObject->_unstub() #15 /srv/mediawiki/php-1.32.0-wmf.13/extensions/TextExtracts/includes/ApiQueryExtracts.php(231): ParserOptions->__construct() #16 /srv/mediawiki/php-1.32.0-wmf.13/extensions/TextExtracts/includes/ApiQueryExtracts.php(180): TextExtracts\ApiQueryExtracts->parse() #17 /srv/mediawiki/php-1.32.0-wmf.13/extensions/TextExtracts/includes/ApiQueryExtracts.php(117): TextExtracts\ApiQueryExtracts->getExtract() #18 /srv/mediawiki/php-1.32.0-wmf.13/includes/api/ApiQuery.php(249): TextExtracts\ApiQueryExtracts->execute() #19 /srv/mediawiki/php-1.32.0-wmf.13/includes/api/ApiMain.php(1582): ApiQuery->execute() #20 /srv/mediawiki/php-1.32.0-wmf.13/includes/api/ApiMain.php(535): ApiMain->executeAction() #21 /srv/mediawiki/php-1.32.0-wmf.13/includes/api/ApiMain.php(506): ApiMain->executeActionWithErrorHandling() #22 /srv/mediawiki/php-1.32.0-wmf.13/api.php(83): ApiMain->execute() #23 /srv/mediawiki/w/api.php(3): include() #24 {main}
Developer notes
From Max:
A quick solution would be to stick DeferredStringifier into block reason and pray that nothing relies too much on it being actual string. A more thorough one would be to refactor the crap from a lot of places: make Block internals hidden and accessible only via getters/setters, then add an option to initialize block reasons with messages that get fetched only when needed.