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
This commit is contained in:
parent
9f53096051
commit
c5a0fa5bed
2 changed files with 89 additions and 1 deletions
|
|
@ -246,8 +246,14 @@ class ObjectCache {
|
||||||
global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
|
global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
|
||||||
$candidates = [ $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType ];
|
$candidates = [ $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType ];
|
||||||
foreach ( $candidates as $candidate ) {
|
foreach ( $candidates as $candidate ) {
|
||||||
|
$cache = false;
|
||||||
if ( $candidate !== CACHE_NONE && $candidate !== CACHE_ANYTHING ) {
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
82
tests/phpunit/includes/objectcache/ObjectCacheTest.php
Normal file
82
tests/phpunit/includes/objectcache/ObjectCacheTest.php
Normal file
|
|
@ -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'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue