CI failure on 1139065 PS14 -- console output
The backtrace indicates that a Session was created and stored in a reference cycle. Later in the same CI run, garbage collection destroyed the session while UserNameUtils was being constructed. SessionBackend::save() called MediaWikiServices::getInstance()->getUserNameUtils() leading to a dependency cycle error.
SessionBackend constructs a metadata array as follows:
'userName' => MediaWikiServices::getInstance()->getUserNameUtils() ->isValid( $this->user->getName() ) ? $this->user->getName() : null,
This code was introduced in change 267143, allowing users with no local account to be stored in the session.
The solutions which occur to me are:
- Stop doing complicated things in a destructor. This is unsafe, because object properties can be destroyed before the object that holds them, so there are a lot of ways for this to randomly fail. Use a shutdown function instead. Register sessions in a container and have the container respond to shutdown.
- Remove the username validity check, just store the name unconditionally. Validity can be the concern of some other layer.
- Fix the reference cycle in REST handlers so that they don't keep Session objects alive past the end of the relevant test.
Backtrace:
There was 1 error: 1) MediaWiki\Tests\Rest\Handler\SitemapFileHandlerTest::testValidCovers Wikimedia\Services\RecursiveServiceDependencyException: Recursive service instantiation: Circular dependency when creating service! LinkCache -> TitleFormatter -> GenderCache -> UserOptionsLookup -> UserOptionsManager -> _DefaultOptionsLookup -> UserIdentityLookup -> ActorStoreFactory -> UserNameUtils -> TitleParser -> InterwikiLookup -> UserNameUtils /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:430 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:406 /workspace/src/includes/MediaWikiServices.php:370 /workspace/src/includes/MediaWikiServices.php:2188 /workspace/src/includes/session/SessionBackend.php:798 /workspace/src/includes/session/SessionBackend.php:232 /workspace/src/includes/session/Session.php:78 /workspace/src/includes/WikiMap/WikiMap.php:309 /workspace/src/includes/WikiMap/WikiMap.php:317 /workspace/src/includes/ServiceWiring.php:1033 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:442 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:406 /workspace/src/includes/MediaWikiServices.php:370 /workspace/src/includes/MediaWikiServices.php:1278 /workspace/src/includes/ServiceWiring.php:2437 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:442 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:406 /workspace/src/includes/MediaWikiServices.php:370 /workspace/src/includes/MediaWikiServices.php:2078 /workspace/src/includes/ServiceWiring.php:2598 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:442 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:406 /workspace/src/includes/MediaWikiServices.php:370 /workspace/src/includes/MediaWikiServices.php:2188 /workspace/src/includes/ServiceWiring.php:344 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:442 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:406 /workspace/src/includes/MediaWikiServices.php:370 /workspace/src/includes/MediaWikiServices.php:739 /workspace/src/includes/ServiceWiring.php:2562 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:442 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:406 /workspace/src/includes/MediaWikiServices.php:370 /workspace/src/includes/MediaWikiServices.php:2160 /workspace/src/includes/ServiceWiring.php:2765 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:442 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:406 /workspace/src/includes/MediaWikiServices.php:370 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:414 /workspace/src/includes/ServiceWiring.php:2614 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:442 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:406 /workspace/src/includes/MediaWikiServices.php:370 /workspace/src/includes/MediaWikiServices.php:2202 /workspace/src/includes/ServiceWiring.php:2608 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:442 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:406 /workspace/src/includes/MediaWikiServices.php:370 /workspace/src/includes/MediaWikiServices.php:2195 /workspace/src/includes/ServiceWiring.php:929 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:442 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:406 /workspace/src/includes/MediaWikiServices.php:370 /workspace/src/includes/MediaWikiServices.php:1207 /workspace/src/includes/ServiceWiring.php:2413 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:442 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:406 /workspace/src/includes/MediaWikiServices.php:370 /workspace/src/includes/MediaWikiServices.php:2064 /workspace/src/includes/ServiceWiring.php:1160 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:442 /workspace/src/vendor/wikimedia/services/src/ServiceContainer.php:406 /workspace/src/includes/MediaWikiServices.php:370 /workspace/src/includes/MediaWikiServices.php:1362 /workspace/src/includes/title/Title.php:2697 /workspace/src/tests/phpunit/MediaWikiIntegrationTestCase.php:551 /workspace/src/tests/phpunit/MediaWikiIntegrationTestCase.php:670