From 519e980f934a5522674ca6fee68f7e3b5398f4ec Mon Sep 17 00:00:00 2001 From: Robin McCorkell Date: Sat, 5 Sep 2015 20:02:49 +0100 Subject: 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. --- lib/private/memcache/memcached.php | 5 +++++ tests/lib/memcache/memcached.php | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/private/memcache/memcached.php b/lib/private/memcache/memcached.php index 042fead3347..c14470ae5ae 100644 --- a/lib/private/memcache/memcached.php +++ b/lib/private/memcache/memcached.php @@ -67,6 +67,11 @@ class Memcached extends Cache { 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')); + } } -- cgit v1.2.3