aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2015-10-09 13:19:26 +0200
committerMorris Jobke <hey@morrisjobke.de>2015-10-09 13:19:26 +0200
commit28de9c7357aad29fb3f84ef307c24dbd25ead675 (patch)
treefc54603902f54163d58f072ce3d3caae23af9327
parent109a206ae3f9ce431e3fa24151b75c9bc03065e8 (diff)
parent519e980f934a5522674ca6fee68f7e3b5398f4ec (diff)
downloadnextcloud-server-28de9c7357aad29fb3f84ef307c24dbd25ead675.tar.gz
nextcloud-server-28de9c7357aad29fb3f84ef307c24dbd25ead675.zip
Merge pull request #18857 from owncloud/memcached-fix-stable8
[stable8] Fallback to complete Memcached flush if getAllKeys fails
-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 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'));
+ }
}