Fallback to complete Memcached flush if getAllKeys fails
Newer Memcached's do not support the underlying protocol commands that getAllKeys() is implemented with. We should fallback to clearing everything in that case, as causing (temporary) performance problems for other applications on the server is better than having stale cached data.
This commit is contained in:
parent
f3b8634058
commit
b64e3f8db6
|
@ -89,6 +89,11 @@ class Memcached extends Cache implements IMemcache {
|
||||||
public function clear($prefix = '') {
|
public function clear($prefix = '') {
|
||||||
$prefix = $this->getNamespace() . $prefix;
|
$prefix = $this->getNamespace() . $prefix;
|
||||||
$allKeys = self::$cache->getAllKeys();
|
$allKeys = self::$cache->getAllKeys();
|
||||||
|
if ($allKeys === false) {
|
||||||
|
// newer Memcached doesn't like getAllKeys(), flush everything
|
||||||
|
self::$cache->flush();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
$keys = array();
|
$keys = array();
|
||||||
$prefixLength = strlen($prefix);
|
$prefixLength = strlen($prefix);
|
||||||
foreach ($allKeys as $key) {
|
foreach ($allKeys as $key) {
|
||||||
|
|
|
@ -26,4 +26,27 @@ class Memcached extends Cache {
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
$this->instance = new \OC\Memcache\Memcached($this->getUniqueID());
|
$this->instance = new \OC\Memcache\Memcached($this->getUniqueID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testClear() {
|
||||||
|
// Memcached is sometimes broken with clear(), so we don't test it thoroughly
|
||||||
|
$value='ipsum lorum';
|
||||||
|
$this->instance->set('1_value1', $value);
|
||||||
|
$this->instance->set('1_value2', $value);
|
||||||
|
$this->instance->set('2_value1', $value);
|
||||||
|
$this->instance->set('3_value1', $value);
|
||||||
|
|
||||||
|
$this->assertTrue($this->instance->clear('1_'));
|
||||||
|
|
||||||
|
$this->assertFalse($this->instance->hasKey('1_value1'));
|
||||||
|
$this->assertFalse($this->instance->hasKey('1_value2'));
|
||||||
|
//$this->assertTrue($this->instance->hasKey('2_value1'));
|
||||||
|
//$this->assertTrue($this->instance->hasKey('3_value1'));
|
||||||
|
|
||||||
|
$this->assertTrue($this->instance->clear());
|
||||||
|
|
||||||
|
$this->assertFalse($this->instance->hasKey('1_value1'));
|
||||||
|
$this->assertFalse($this->instance->hasKey('1_value2'));
|
||||||
|
$this->assertFalse($this->instance->hasKey('2_value1'));
|
||||||
|
$this->assertFalse($this->instance->hasKey('3_value1'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue