objectcache: Log debug message for backend of WANObjectCache
[lhc/web/wiklou.git] / includes / ServiceWiring.php
index 4cd3d85..6e31e86 100644 (file)
  * For every service that MediaWiki core requires, an instantiator must be defined in
  * this file.
  *
+ * Note that, ideally, all information used to instantiate service objects should come
+ * from configuration. Information derived from the current request is acceptable, but
+ * only where there is no feasible alternative. It is preferred that such information
+ * (like the client IP, the acting user's identity, requested title, etc) be passed to
+ * the service object's methods as parameters. This makes the flow of information more
+ * obvious, and makes it easier to understand the behavior of services.
+ *
  * @note As of version 1.27, MediaWiki is only beginning to use dependency injection.
  * The services defined here do not yet fully represent all services used by core,
  * much of the code still relies on global state for this accessing services.
@@ -49,6 +56,7 @@ use MediaWiki\FileBackend\LockManager\LockManagerGroupFactory;
 use MediaWiki\Http\HttpRequestFactory;
 use MediaWiki\Interwiki\ClassicInterwikiLookup;
 use MediaWiki\Interwiki\InterwikiLookup;
+use MediaWiki\Languages\LanguageNameUtils;
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\Logger\LoggerFactory;
@@ -100,7 +108,7 @@ return [
                        $services->getDBLoadBalancerFactory(),
                        $services->getExternalStoreAccess(),
                        $services->getMainWANObjectCache(),
-                       new ServiceOptions( BlobStoreFactory::$constructorOptions,
+                       new ServiceOptions( BlobStoreFactory::CONSTRUCTOR_OPTIONS,
                                $services->getMainConfig() ),
                        $services->getContentLanguage()
                );
@@ -109,7 +117,7 @@ return [
        'BlockManager' => function ( MediaWikiServices $services ) : BlockManager {
                return new BlockManager(
                        new ServiceOptions(
-                               BlockManager::$constructorOptions, $services->getMainConfig()
+                               BlockManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
                        ),
                        $services->getPermissionManager(),
                        LoggerFactory::getInstance( 'BlockManager' )
@@ -192,7 +200,7 @@ return [
 
                $lbConf = MWLBFactory::applyDefaultConfig(
                        $mainConfig->get( 'LBFactoryConf' ),
-                       new ServiceOptions( MWLBFactory::$applyDefaultConfigOptions, $mainConfig ),
+                       new ServiceOptions( MWLBFactory::APPLY_DEFAULT_CONFIG_OPTIONS, $mainConfig ),
                        $services->getConfiguredReadOnlyMode(),
                        $services->getLocalServerObjectCache(),
                        $services->getMainObjectStash(),
@@ -200,10 +208,7 @@ return [
                );
                $class = MWLBFactory::getLBFactoryClass( $lbConf );
 
-               $instance = new $class( $lbConf );
-               MWLBFactory::setSchemaAliases( $instance, $mainConfig->get( 'DBtype' ) );
-
-               return $instance;
+               return new $class( $lbConf );
        },
 
        'EventRelayerGroup' => function ( MediaWikiServices $services ) : EventRelayerGroup {
@@ -255,6 +260,13 @@ return [
                );
        },
 
+       'LanguageNameUtils' => function ( MediaWikiServices $services ) : LanguageNameUtils {
+               return new LanguageNameUtils( new ServiceOptions(
+                       LanguageNameUtils::$constructorOptions,
+                       $services->getMainConfig()
+               ) );
+       },
+
        'LinkCache' => function ( MediaWikiServices $services ) : LinkCache {
                return new LinkCache(
                        $services->getTitleFormatter(),
@@ -267,6 +279,8 @@ return [
                if ( defined( 'MW_NO_SESSION' ) ) {
                        return $services->getLinkRendererFactory()->create();
                } else {
+                       // Normally information from the current request would not be passed in here;
+                       // this is an exception. (See also the class documentation.)
                        return $services->getLinkRendererFactory()->createForUser(
                                RequestContext::getMain()->getUser()
                        );
@@ -281,6 +295,37 @@ return [
                );
        },
 
+       'LocalisationCache' => function ( MediaWikiServices $services ) : LocalisationCache {
+               $conf = $services->getMainConfig()->get( 'LocalisationCacheConf' );
+
+               $logger = LoggerFactory::getInstance( 'localisation' );
+
+               $store = LocalisationCache::getStoreFromConf(
+                       $conf, $services->getMainConfig()->get( 'CacheDirectory' ) );
+               $logger->debug( 'LocalisationCache: using store ' . get_class( $store ) );
+
+               return new $conf['class'](
+                       new ServiceOptions(
+                               LocalisationCache::CONSTRUCTOR_OPTIONS,
+                               // Two of the options are stored in $wgLocalisationCacheConf
+                               $conf,
+                               // In case someone set that config variable and didn't reset all keys, set defaults.
+                               [
+                                       'forceRecache' => false,
+                                       'manualRecache' => false,
+                               ],
+                               // Some other options come from config itself
+                               $services->getMainConfig()
+                       ),
+                       $store,
+                       $logger,
+                       [ function () use ( $services ) {
+                               $services->getResourceLoader()->getMessageBlobStore()->clear();
+                       } ],
+                       $services->getLanguageNameUtils()
+               );
+       },
+
        'LocalServerObjectCache' => function ( MediaWikiServices $services ) : BagOStuff {
                $config = $services->getMainConfig();
                $cacheId = ObjectCache::detectLocalServerCache();
@@ -327,14 +372,35 @@ return [
                }
 
                $params = $mainConfig->get( 'WANObjectCaches' )[$id];
+
+               $logger = LoggerFactory::getInstance( $params['loggroup'] ?? 'objectcache' );
+
                $objectCacheId = $params['cacheId'];
                if ( !isset( $mainConfig->get( 'ObjectCaches' )[$objectCacheId] ) ) {
                        throw new UnexpectedValueException(
                                "Cache type \"$objectCacheId\" is not present in \$wgObjectCaches." );
                }
-               $params['store'] = $mainConfig->get( 'ObjectCaches' )[$objectCacheId];
+               $storeParams = $mainConfig->get( 'ObjectCaches' )[$objectCacheId];
+               $store = ObjectCache::newFromParams( $storeParams );
+               $logger->debug( 'MainWANObjectCache using store {class}', [
+                       'class' => get_class( $store )
+               ] );
+
+               $params['logger'] = $logger;
+               $params['cache'] = $store;
+               $params['secret'] = $params['secret'] ?? $mainConfig->get( 'SecretKey' );
+               if ( !$mainConfig->get( 'CommandLineMode' ) ) {
+                       // Send the statsd data post-send on HTTP requests; avoid in CLI mode (T181385)
+                       $params['stats'] = $services->getStatsdDataFactory();
+                       // Let pre-emptive refreshes happen post-send on HTTP requests
+                       $params['asyncHandler'] = [ DeferredUpdates::class, 'addCallableUpdate' ];
+               }
+
+               $class = $params['class'];
+               $instance = new $class( $params );
 
-               return ObjectCache::newWANCacheFromParams( $params );
+               '@phan-var WANObjectCache $instance';
+               return $instance;
        },
 
        'MediaHandlerFactory' => function ( MediaWikiServices $services ) : MediaHandlerFactory {
@@ -515,6 +581,17 @@ return [
                );
        },
 
+       'PasswordReset' => function ( MediaWikiServices $services ) : PasswordReset {
+               $options = new ServiceOptions( PasswordReset::CONSTRUCTOR_OPTIONS, $services->getMainConfig() );
+               return new PasswordReset(
+                       $options,
+                       AuthManager::singleton(),
+                       $services->getPermissionManager(),
+                       $services->getDBLoadBalancer(),
+                       LoggerFactory::getInstance( 'authentication' )
+               );
+       },
+
        'PerDbNameStatsdDataFactory' =>
        function ( MediaWikiServices $services ) : StatsdDataFactoryInterface {
                $config = $services->getMainConfig();
@@ -528,7 +605,7 @@ return [
        'PermissionManager' => function ( MediaWikiServices $services ) : PermissionManager {
                return new PermissionManager(
                        new ServiceOptions(
-                               PermissionManager::$constructorOptions, $services->getMainConfig()
+                               PermissionManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
                        ),
                        $services->getSpecialPageFactory(),
                        $services->getRevisionLookup(),
@@ -539,7 +616,7 @@ return [
        'PreferencesFactory' => function ( MediaWikiServices $services ) : PreferencesFactory {
                $factory = new DefaultPreferencesFactory(
                        new ServiceOptions(
-                               DefaultPreferencesFactory::$constructorOptions, $services->getMainConfig() ),
+                               DefaultPreferencesFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
                        $services->getContentLanguage(),
                        AuthManager::singleton(),
                        $services->getLinkRendererFactory()->create(),
@@ -784,7 +861,8 @@ return [
                        $services->getDBLoadBalancer(),
                        $services->getCommentStore(),
                        $services->getActorMigration(),
-                       $services->getWatchedItemStore()
+                       $services->getWatchedItemStore(),
+                       $services->getPermissionManager()
                );
        },