diff options
author | Robin McCorkell <rmccorkell@owncloud.com> | 2015-09-05 20:02:49 +0100 |
---|---|---|
committer | Robin McCorkell <rmccorkell@owncloud.com> | 2015-09-05 20:02:49 +0100 |
commit | b64e3f8db609b1f65ec23f467da7488abf92c05a (patch) | |
tree | 82b086de95f9ee46e6b003c425ddf9b995e4d97b | |
parent | f3b8634058db07555b31a8fde8e02d4eb6201dae (diff) | |
download | nextcloud-server-b64e3f8db609b1f65ec23f467da7488abf92c05a.tar.gz nextcloud-server-b64e3f8db609b1f65ec23f467da7488abf92c05a.zip |
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.
-rw-r--r-- | lib/private/memcache/memcached.php | 5 | ||||
-rw-r--r-- | tests/lib/memcache/memcached.php | 23 |
2 files changed, 28 insertions, 0 deletions
diff --git a/lib/private/memcache/memcached.php b/lib/private/memcache/memcached.php index 1503851fd73..e99303ecc15 100644 --- a/lib/private/memcache/memcached.php +++ b/lib/private/memcache/memcached.php @@ -89,6 +89,11 @@ class Memcached extends Cache implements IMemcache { public function clear($prefix = '') { $prefix = $this->getNamespace() . $prefix; $allKeys = self::$cache->getAllKeys(); + if ($allKeys === false) { + // newer Memcached doesn't like getAllKeys(), flush everything + self::$cache->flush(); + return true; + } $keys = array(); $prefixLength = strlen($prefix); foreach ($allKeys as $key) { diff --git a/tests/lib/memcache/memcached.php b/tests/lib/memcache/memcached.php index 51a78996dd4..3ea9216029a 100644 --- a/tests/lib/memcache/memcached.php +++ b/tests/lib/memcache/memcached.php @@ -26,4 +26,27 @@ class Memcached extends Cache { parent::setUp(); $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')); + } } |