summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin McCorkell <rmccorkell@owncloud.com>2015-09-05 20:02:49 +0100
committerRobin McCorkell <rmccorkell@owncloud.com>2015-09-05 20:02:49 +0100
commitb64e3f8db609b1f65ec23f467da7488abf92c05a (patch)
tree82b086de95f9ee46e6b003c425ddf9b995e4d97b
parentf3b8634058db07555b31a8fde8e02d4eb6201dae (diff)
downloadnextcloud-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.php5
-rw-r--r--tests/lib/memcache/memcached.php23
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'));
+ }
}