Page MenuHomePhabricator

BadMethodCallException: Sessions are disabled for opensearch_desc entry point
Closed, ResolvedPublic2 Estimated Story PointsPRODUCTION ERROR

Description

Error
message
[2023-06-22T13:19:20.132803+00:00] exception.ERROR: [aa528f1b00f0f7f62e062176] /w/opensearch_desc.php   BadMethodCallException: Sessions are disabled for opensearch_desc entry point {"exception":"[object] (BadMethodCallException(code: 0): Sessions are disabled for opensearch_desc entry point at /srv/mediawiki/tags/2023-06-22_12:22:03/includes/session/SessionManager.php:900)
trace
#0 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/session/SessionManager.php(363): MediaWiki\\Session\\SessionManager->getSessionFromInfo()
#1 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/session/SessionManager.php(296): MediaWiki\\Session\\SessionManager->getEmptySessionInternal()
#2 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/session/SessionManager.php(376): MediaWiki\\Session\\SessionManager->getEmptySession()
#3 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/session/SessionManager.php(247): MediaWiki\\Session\\SessionManager->getInitialSession()
#4 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/WebRequest.php(840): MediaWiki\\Session\\SessionManager->getSessionForRequest()
#5 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/session/SessionManager.php(165): WebRequest->getSession()
#6 /srv/mediawiki/tags/2023-06-22_12:22:03/extensions/AbuseFilter/includes/ServiceWiring.php(214): MediaWiki\\Session\\SessionManager::getGlobalSession()
#7 /srv/mediawiki/tags/2023-06-22_12:22:03/vendor/wikimedia/services/src/ServiceContainer.php(447): Wikimedia\\Services\\ServiceContainer::{closure}()
#8 /srv/mediawiki/tags/2023-06-22_12:22:03/vendor/wikimedia/services/src/ServiceContainer.php(411): Wikimedia\\Services\\ServiceContainer->createService()
#9 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/MediaWikiServices.php(326): Wikimedia\\Services\\ServiceContainer->getService()
#10 /srv/mediawiki/tags/2023-06-22_12:22:03/vendor/wikimedia/services/src/ServiceContainer.php(419): MediaWiki\\MediaWikiServices->getService()
#11 /srv/mediawiki/tags/2023-06-22_12:22:03/extensions/AbuseFilter/includes/ServiceWiring.php(277): Wikimedia\\Services\\ServiceContainer->get()
#12 /srv/mediawiki/tags/2023-06-22_12:22:03/vendor/wikimedia/services/src/ServiceContainer.php(447): Wikimedia\\Services\\ServiceContainer::{closure}()
#13 /srv/mediawiki/tags/2023-06-22_12:22:03/vendor/wikimedia/services/src/ServiceContainer.php(411): Wikimedia\\Services\\ServiceContainer->createService()
#14 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/MediaWikiServices.php(326): Wikimedia\\Services\\ServiceContainer->getService()
#15 /srv/mediawiki/tags/2023-06-22_12:22:03/vendor/wikimedia/services/src/ServiceContainer.php(419): MediaWiki\\MediaWikiServices->getService()
#16 /srv/mediawiki/tags/2023-06-22_12:22:03/extensions/AbuseFilter/includes/ServiceWiring.php(295): Wikimedia\\Services\\ServiceContainer->get()
#17 /srv/mediawiki/tags/2023-06-22_12:22:03/vendor/wikimedia/services/src/ServiceContainer.php(447): Wikimedia\\Services\\ServiceContainer::{closure}()
#18 /srv/mediawiki/tags/2023-06-22_12:22:03/vendor/wikimedia/services/src/ServiceContainer.php(411): Wikimedia\\Services\\ServiceContainer->createService()
#19 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/MediaWikiServices.php(326): Wikimedia\\Services\\ServiceContainer->getService()
#20 /srv/mediawiki/tags/2023-06-22_12:22:03/vendor/wikimedia/services/src/ServiceContainer.php(419): MediaWiki\\MediaWikiServices->getService()
#21 /srv/mediawiki/tags/2023-06-22_12:22:03/vendor/wikimedia/object-factory/src/ObjectFactory.php(204): Wikimedia\\Services\\ServiceContainer->get()
#22 /srv/mediawiki/tags/2023-06-22_12:22:03/vendor/wikimedia/object-factory/src/ObjectFactory.php(149): Wikimedia\\ObjectFactory\\ObjectFactory::getObjectFromSpec()
#23 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/HookContainer/HookContainer.php(251): Wikimedia\\ObjectFactory\\ObjectFactory->createObject()
#24 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/HookContainer/HookContainer.php(332): MediaWiki\\HookContainer\\HookContainer->makeExtensionHandlerCallback()
#25 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/HookContainer/HookContainer.php(477): MediaWiki\\HookContainer\\HookContainer->normalizeHandler()
#26 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/HookContainer/HookContainer.php(410): MediaWiki\\HookContainer\\HookContainer->getHandlers()
#27 /srv/mediawiki/tags/2023-06-22_12:22:03/extensions/SemanticMediaWiki/src/MediaWiki/Hooks.php(152): MediaWiki\\HookContainer\\HookContainer->register()
#28 /srv/mediawiki/tags/2023-06-22_12:22:03/extensions/SemanticMediaWiki/src/Setup.php(389): SMW\\MediaWiki\\Hooks->register()
#29 /srv/mediawiki/tags/2023-06-22_12:22:03/extensions/SemanticMediaWiki/src/Setup.php(152): SMW\\Setup->registerHooks()
#30 /srv/mediawiki/tags/2023-06-22_12:22:03/extensions/SemanticMediaWiki/includes/SemanticMediaWiki.php(84): SMW\\Setup->init()
#31 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/Setup.php(563): SemanticMediaWiki::onExtensionFunction()
#32 /srv/mediawiki/tags/2023-06-22_12:22:03/includes/WebStart.php(92): require_once('/srv/mediawiki/...')
#33 /srv/mediawiki/tags/2023-06-22_12:22:03/opensearch_desc.php(38): require_once('/srv/mediawiki/...')
#34 {main}
Impact

Logspam and maybe others?

Notes

Noticed this after the latest deployment on translatewiki.net
Running MediaWiki version: https://github.com/wikimedia/mediawiki/commit/810a983070772c87c358c6d3dfe0eff5a0f36f08

Event Timeline

abi_ renamed this task from Sessions are disabled for opensearch_desc entry point to BadMethodCallException: Sessions are disabled for opensearch_desc entry point.Jun 22 2023, 1:42 PM

The trigger of this error is probably https://gerrit.wikimedia.org/r/c/mediawiki/core/+/927596: HookContainer::register() will now instantiate any other handler objects registred for the hook, so HookContainer->handlers will onyl ever contain fully normalized handlers, and contains them in the correct sequence.

The error could be avoided by having HookContainer::register() put handlers into a spearate array if HookContainer->handlers is not yet initialized, but it complicates the code. And it really shouldn't be necessary, since it should always be possible to initialize hook handlers.

Taking a step back, the root cause of the issue is the fact that AbuseFilter's ServiceWiring calls SessionManager::getGlobalSession(), which it shouldn't. Service wiring should only defend on config, not on request state. And since opensearch_desc .php disables sessions, getGlobalSession() fails, which causes the service initialization to fail, which causes the hook handler initialization to fail.

Note that this failure would always have been triggered when the hook was called. But apparently, it never is called in this context. So previously, we never tried to instantiate all the handlers.

Possible solutions:

  1. Make AbuseFilter not access session data in servide wiring.
  2. Make SMW not rely on late dynamic registration of hooks (use extension.json or SettingsBuilder::registerHookHandlers from the registration callback).
  3. Make HookContainer::register() stash handlers in a separate arary to avoid initializing hook handlers before the hook is actually called.

I can do option 3 if need be, but as stated above it complicates the code, and it really only hides a deeper problem.

Change 933480 had a related patch set uploaded (by Abijeet Patro; author: Abijeet Patro):

[mediawiki/extensions/AbuseFilter@master] ConsequencesFactory: Avoid creating Session object during service wiring

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

abi_ triaged this task as Medium priority.
abi_ set the point value for this task to 2.

Change 933480 merged by jenkins-bot:

[mediawiki/extensions/AbuseFilter@master] ConsequencesFactory: Avoid creating Session object during service wiring

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

Tested on translatewiki.net. No error logs reported

Change 939764 had a related patch set uploaded (by Daniel Kinzler; author: Daniel Kinzler):

[mediawiki/core@master] HookContainer: avoid instantiation of handlers when calling register()

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

Change 939764 merged by jenkins-bot:

[mediawiki/core@master] HookContainer: avoid instantiation of handlers when calling register()

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

Change 940918 had a related patch set uploaded (by Zabe; author: Daniel Kinzler):

[mediawiki/core@wmf/1.41.0-wmf.18] HookContainer: avoid instantiation of handlers when calling register()

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

Change 940918 merged by jenkins-bot:

[mediawiki/core@wmf/1.41.0-wmf.18] HookContainer: avoid instantiation of handlers when calling register()

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

Mentioned in SAL (#wikimedia-operations) [2023-07-24T22:36:21Z] <zabe@deploy1002> Started scap: Backport for [[gerrit:940919|client: Avoid dynamically registering hook handlers (T341102)]], [[gerrit:940918|HookContainer: avoid instantiation of handlers when calling register() (T341102 T340113 T339834)]]

Mentioned in SAL (#wikimedia-operations) [2023-07-24T22:37:46Z] <zabe@deploy1002> zabe: Backport for [[gerrit:940919|client: Avoid dynamically registering hook handlers (T341102)]], [[gerrit:940918|HookContainer: avoid instantiation of handlers when calling register() (T341102 T340113 T339834)]] synced to the testservers mwdebug2002.codfw.wmnet, mwdebug2001.codfw.wmnet, mwdebug1001.eqiad.wmnet, mwdebug1002.eqiad.wmnet, and mw-debug kubernetes deployment (accessible via k8s-experime

Mentioned in SAL (#wikimedia-operations) [2023-07-24T22:46:20Z] <zabe@deploy1002> Finished scap: Backport for [[gerrit:940919|client: Avoid dynamically registering hook handlers (T341102)]], [[gerrit:940918|HookContainer: avoid instantiation of handlers when calling register() (T341102 T340113 T339834)]] (duration: 09m 59s)