From 6d99fa58247a1de7eaf9a79a061f0b4207154072 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Wed, 21 Sep 2016 09:00:08 -0700 Subject: [PATCH] Add the main stash, WAN, and server caches to MediaWikiServices Also removed unused getLocalServerInstance() b/c $fallback logic. Change-Id: Ifa5f798de10783741a7b079f22d283bb9cb7f4c0 --- includes/MediaWikiServices.php | 24 +++++++++ includes/ServiceWiring.php | 53 +++++++++++++++++++ includes/objectcache/ObjectCache.php | 31 ++++------- tests/phpunit/MediaWikiTestCase.php | 4 ++ .../includes/MediaWikiServicesTest.php | 7 ++- 5 files changed, 96 insertions(+), 23 deletions(-) diff --git a/includes/MediaWikiServices.php b/includes/MediaWikiServices.php index b16044e12d..199472ad20 100644 --- a/includes/MediaWikiServices.php +++ b/includes/MediaWikiServices.php @@ -589,6 +589,30 @@ class MediaWikiServices extends ServiceContainer { return $this->getService( 'TitleParser' ); } + /** + * @since 1.28 + * @return \BagOStuff + */ + public function getMainObjectStash() { + return $this->getService( 'MainObjectStash' ); + } + + /** + * @since 1.28 + * @return \WANObjectCache + */ + public function getMainWANObjectCache() { + return $this->getService( 'MainWANObjectCache' ); + } + + /** + * @since 1.28 + * @return \BagOStuff + */ + public function getLocalServerObjectCache() { + return $this->getService( 'LocalServerObjectCache' ); + } + /** * @since 1.28 * @return VirtualRESTServiceClient diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index 604491192a..0e4daa6fa7 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -218,6 +218,59 @@ return [ return $services->getService( '_MediaWikiTitleCodec' ); }, + 'MainObjectStash' => function( MediaWikiServices $services ) { + $mainConfig = $services->getMainConfig(); + + $id = $mainConfig->get( 'MainStash' ); + if ( !isset( $mainConfig->get( 'ObjectCaches' )[$id] ) ) { + throw new UnexpectedValueException( + "Cache type \"$id\" is not present in \$wgObjectCaches." ); + } + + return \ObjectCache::newFromParams( $mainConfig->get( 'ObjectCaches' )[$id] ); + }, + + 'MainWANObjectCache' => function( MediaWikiServices $services ) { + $mainConfig = $services->getMainConfig(); + + $id = $mainConfig->get( 'MainWANCache' ); + if ( !isset( $mainConfig->get( 'WANObjectCaches' )[$id] ) ) { + throw new UnexpectedValueException( + "WAN cache type \"$id\" is not present in \$wgWANObjectCaches." ); + } + + $params = $mainConfig->get( 'WANObjectCaches' )[$id]; + $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]; + + return \ObjectCache::newWANCacheFromParams( $params ); + }, + + 'LocalServerObjectCache' => function( MediaWikiServices $services ) { + $mainConfig = $services->getMainConfig(); + + if ( function_exists( 'apc_fetch' ) ) { + $id = 'apc'; + } elseif ( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) { + $id = 'xcache'; + } elseif ( function_exists( 'wincache_ucache_get' ) ) { + $id = 'wincache'; + } else { + $id = CACHE_NONE; + } + + if ( !isset( $mainConfig->get( 'ObjectCaches' )[$id] ) ) { + throw new UnexpectedValueException( + "Cache type \"$id\" is not present in \$wgObjectCaches." ); + } + + return \ObjectCache::newFromParams( $mainConfig->get( 'ObjectCaches' )[$id] ); + }, + 'VirtualRESTServiceClient' => function( MediaWikiServices $services ) { $config = $services->getMainConfig()->get( 'VirtualRestConfig' ); diff --git a/includes/objectcache/ObjectCache.php b/includes/objectcache/ObjectCache.php index d81f9e13cb..0f18479bbd 100644 --- a/includes/objectcache/ObjectCache.php +++ b/includes/objectcache/ObjectCache.php @@ -274,27 +274,18 @@ class ObjectCache { * // From $wgObjectCaches via newFromParams() * ObjectCache::getLocalServerInstance( [ 'fallback' => $fallbackType ] ); * - * @param int|string|array $fallback Fallback cache or parameter map with 'fallback' + * @param int|string $fallback Fallback cache ID * @return BagOStuff * @throws InvalidArgumentException * @since 1.27 + * @deprecated Since 1.28; use MediaWikiServices::getLocalServerObjectCache */ public static function getLocalServerInstance( $fallback = CACHE_NONE ) { - if ( function_exists( 'apc_fetch' ) ) { - $id = 'apc'; - } elseif ( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) { - $id = 'xcache'; - } elseif ( function_exists( 'wincache_ucache_get' ) ) { - $id = 'wincache'; - } else { - if ( is_array( $fallback ) ) { - $id = isset( $fallback['fallback'] ) ? $fallback['fallback'] : CACHE_NONE; - } else { - $id = $fallback; - } - } + $cache = MediaWikiServices::getInstance()->getLocalServerObjectCache(); - return self::getInstance( $id ); + return ( $cache instanceof EmptyBagOStuff ) + ? self::getInstance( $fallback ) + : $cache; } /** @@ -383,11 +374,10 @@ class ObjectCache { * * @since 1.26 * @return WANObjectCache + * @deprecated Since 1.28 Use MediaWikiServices::getMainWANCache() */ public static function getMainWANInstance() { - global $wgMainWANCache; - - return self::getWANInstance( $wgMainWANCache ); + return MediaWikiServices::getInstance()->getMainWANObjectCache(); } /** @@ -407,11 +397,10 @@ class ObjectCache { * * @return BagOStuff * @since 1.26 + * @deprecated Since 1.28 Use MediaWikiServices::getMainObjectStash */ public static function getMainStashInstance() { - global $wgMainStash; - - return self::getInstance( $wgMainStash ); + return MediaWikiServices::getInstance()->getMainObjectStash(); } /** diff --git a/tests/phpunit/MediaWikiTestCase.php b/tests/phpunit/MediaWikiTestCase.php index 45a7ce5f59..e53a958387 100644 --- a/tests/phpunit/MediaWikiTestCase.php +++ b/tests/phpunit/MediaWikiTestCase.php @@ -336,6 +336,10 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase { JobQueueGroup::destroySingletons(); ObjectCache::clear(); + $services = MediaWikiServices::getInstance(); + $services->resetServiceForTesting( 'MainObjectStash' ); + $services->resetServiceForTesting( 'LocalServerObjectCache' ); + $services->getMainWANObjectCache()->clearProcessCache(); FileBackendGroup::destroySingleton(); // TODO: move global state into MediaWikiServices diff --git a/tests/phpunit/includes/MediaWikiServicesTest.php b/tests/phpunit/includes/MediaWikiServicesTest.php index a05e39d974..4fbef6ce67 100644 --- a/tests/phpunit/includes/MediaWikiServicesTest.php +++ b/tests/phpunit/includes/MediaWikiServicesTest.php @@ -320,8 +320,11 @@ class MediaWikiServicesTest extends MediaWikiTestCase { '_MediaWikiTitleCodec' => [ '_MediaWikiTitleCodec', MediaWikiTitleCodec::class ], 'TitleFormatter' => [ 'TitleFormatter', TitleFormatter::class ], 'TitleParser' => [ 'TitleParser', TitleParser::class ], - 'VirtualRESTServiceClient' => [ 'VirtualRESTServiceClient', VirtualRESTServiceClient::class ], - 'ProxyLookup' => [ 'ProxyLookup', ProxyLookup::class ] + 'ProxyLookup' => [ 'ProxyLookup', ProxyLookup::class ], + 'MainObjectStash' => [ 'MainObjectStash', BagOStuff::class ], + 'MainWANObjectCache' => [ 'MainWANObjectCache', WANObjectCache::class ], + 'LocalServerObjectCache' => [ 'LocalServerObjectCache', BagOStuff::class ], + 'VirtualRESTServiceClient' => [ 'VirtualRESTServiceClient', VirtualRESTServiceClient::class ] ]; } -- 2.20.1