jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/342959 )
Change subject: objectcache: Never use CACHE_NONE for CACHE_ANYTHING ...................................................................... objectcache: Never use CACHE_NONE for CACHE_ANYTHING If $wgMainCacheType = CACHE_ACCEL, but there is no APC, then its possible that CACHE_ANYTHING will default to CACHE_NONE because that's what CACHE_ACCEL would do. Possibly also T147161 Bug: T160519 Change-Id: I9ac2d071437b35a0f9cd3678e2279628f7b1931e --- M includes/objectcache/ObjectCache.php A tests/phpunit/includes/objectcache/ObjectCacheTest.php 2 files changed, 89 insertions(+), 1 deletion(-) Approvals: Krinkle: Looks good to me, approved jenkins-bot: Verified diff --git a/includes/objectcache/ObjectCache.php b/includes/objectcache/ObjectCache.php index cf9033b..3370e5b 100644 --- a/includes/objectcache/ObjectCache.php +++ b/includes/objectcache/ObjectCache.php @@ -246,8 +246,14 @@ global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType; $candidates = [ $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType ]; foreach ( $candidates as $candidate ) { + $cache = false; if ( $candidate !== CACHE_NONE && $candidate !== CACHE_ANYTHING ) { - return self::getInstance( $candidate ); + $cache = self::getInstance( $candidate ); + // CACHE_ACCEL might default to nothing if no APCu + // See includes/ServiceWiring.php + if ( !( $cache instanceof EmptyBagOStuff ) ) { + return $cache; + } } } diff --git a/tests/phpunit/includes/objectcache/ObjectCacheTest.php b/tests/phpunit/includes/objectcache/ObjectCacheTest.php new file mode 100644 index 0000000..d132183 --- /dev/null +++ b/tests/phpunit/includes/objectcache/ObjectCacheTest.php @@ -0,0 +1,82 @@ +<?php + +class ObjectCacheTest extends MediaWikiTestCase { + + protected function setUp() { + // Parent calls ObjectCache::clear() among other things + parent::setUp(); + + $this->setCacheConfig(); + $this->setMwGlobals( [ + 'wgMainCacheType' => CACHE_NONE, + 'wgMessageCacheType' => CACHE_NONE, + 'wgParserCacheType' => CACHE_NONE, + ] ); + } + + private function setCacheConfig( $arr = [] ) { + $defaults = [ + CACHE_NONE => [ 'class' => 'EmptyBagOStuff' ], + CACHE_DB => [ 'class' => 'SqlBagOStuff' ], + CACHE_ANYTHING => [ 'factory' => 'ObjectCache::newAnything' ], + // Mock ACCEL with 'hash' as being installed. + // This makes tests deterministic regardless of APC. + CACHE_ACCEL => [ 'class' => 'HashBagOStuff' ], + 'hash' => [ 'class' => 'HashBagOStuff' ], + ]; + $this->setMwGlobals( 'wgObjectCaches', $arr + $defaults ); + } + + /** @covers ObjectCache::newAnything */ + public function testNewAnythingNothing() { + $this->assertInstanceOf( + SqlBagOStuff::class, + ObjectCache::newAnything( [] ), + 'No available types. Fallback to DB' + ); + } + + /** @covers ObjectCache::newAnything */ + public function testNewAnythingHash() { + $this->setMwGlobals( [ + 'wgMainCacheType' => 'hash' + ] ); + + $this->assertInstanceOf( + HashBagOStuff::class, + ObjectCache::newAnything( [] ), + 'Use an available type (hash)' + ); + } + + /** @covers ObjectCache::newAnything */ + public function testNewAnythingAccel() { + $this->setMwGlobals( [ + 'wgMainCacheType' => CACHE_ACCEL + ] ); + + $this->assertInstanceOf( + HashBagOStuff::class, + ObjectCache::newAnything( [] ), + 'Use an available type (CACHE_ACCEL)' + ); + } + + /** @covers ObjectCache::newAnything */ + public function txestNewAnythingNoAccel() { + $this->setMwGlobals( [ + 'wgMainCacheType' => CACHE_ACCEL + ] ); + + $this->setCacheConfig( [ + // Mock APC not being installed (T160519, T147161) + CACHE_ACCEL => [ 'class' => 'EmptyBagOStuff' ] + ] ); + + $this->assertInstanceOf( + SqlBagOStuff::class, + ObjectCache::newAnything( [] ), + 'Fallback to DB if available types fall back to Empty' + ); + } +} -- To view, visit https://gerrit.wikimedia.org/r/342959 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I9ac2d071437b35a0f9cd3678e2279628f7b1931e Gerrit-PatchSet: 8 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: Brian Wolff <bawolff...@gmail.com> Gerrit-Reviewer: Aaron Schulz <asch...@wikimedia.org> Gerrit-Reviewer: Brian Wolff <bawolff...@gmail.com> Gerrit-Reviewer: Jforrester <jforres...@wikimedia.org> Gerrit-Reviewer: Krinkle <krinklem...@gmail.com> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits