From 514d759b580eca705c1ac1b47f8446657c9b5faa Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Thu, 29 Sep 2016 12:36:27 -0700 Subject: [PATCH] Add the main stash, WAN, and server caches to MediaWikiServices Leave getLocalServerInstance() array fallback logic. Restores 6d99fa58247a1de7eaf9a79a061f0b4207154072 Which got reverted by 7ab928329235451aaa0a813fc16e37cf44d8999a. Change-Id: Id1f48e10753d6aaf64eecb4d3c2228740abc1340 --- includes/MediaWikiServices.php | 24 ++++++++ includes/ServiceWiring.php | 55 +++++++++++++++++++ includes/objectcache/ObjectCache.php | 28 +++------- tests/phpunit/MediaWikiTestCase.php | 4 ++ .../includes/MediaWikiServicesTest.php | 7 ++- 5 files changed, 97 insertions(+), 21 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 11ee616344..b6fecd7650 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -218,6 +218,61 @@ 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( 'apcu_fetch' ) ) { + $id = 'apcu'; + } 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 87a62727fe..df249b2bf7 100644 --- a/includes/objectcache/ObjectCache.php +++ b/includes/objectcache/ObjectCache.php @@ -280,23 +280,15 @@ class ObjectCache { * @since 1.27 */ public static function getLocalServerInstance( $fallback = CACHE_NONE ) { - if ( function_exists( 'apc_fetch' ) ) { - $id = 'apc'; - } elseif ( function_exists( 'apcu_fetch' ) ) { - $id = 'apcu'; - } elseif ( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) { - $id = 'xcache'; - } elseif ( function_exists( 'wincache_ucache_get' ) ) { - $id = 'wincache'; - } else { + $cache = MediaWikiServices::getInstance()->getLocalServerObjectCache(); + if ( $cache instanceof EmptyBagOStuff ) { if ( is_array( $fallback ) ) { - $id = isset( $fallback['fallback'] ) ? $fallback['fallback'] : CACHE_NONE; - } else { - $id = $fallback; + $fallback = isset( $fallback['fallback'] ) ? $fallback['fallback'] : CACHE_NONE; } + $cache = self::getInstance( $fallback ); } - return self::getInstance( $id ); + return $cache; } /** @@ -385,11 +377,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(); } /** @@ -409,11 +400,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