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.