From 2f67aa9bc41df280c9ac869b0387710eb3995ed1 Mon Sep 17 00:00:00 2001
From: Joas Schilling <nickvergessen@owncloud.com>
Date: Mon, 14 Mar 2016 12:34:11 +0100
Subject: [PATCH] Fix errors in memcached implementation

---
 lib/private/memcache/memcached.php | 21 +++++++++++++++++----
 tests/lib/memcache/cache.php       |  9 ++++++++-
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/lib/private/memcache/memcached.php b/lib/private/memcache/memcached.php
index c13be68b47f..a30f9da7ed7 100644
--- a/lib/private/memcache/memcached.php
+++ b/lib/private/memcache/memcached.php
@@ -88,7 +88,9 @@ class Memcached extends Cache implements IMemcache {
 
 	public function remove($key) {
 		$result= self::$cache->delete($this->getNamespace() . $key);
-		$this->verifyReturnCode();
+		if (self::$cache->getResultCode() !== \Memcached::RES_NOTFOUND) {
+			$this->verifyReturnCode();
+		}
 		return $result;
 	}
 
@@ -124,10 +126,13 @@ class Memcached extends Cache implements IMemcache {
 	 * @param mixed $value
 	 * @param int $ttl Time To Live in seconds. Defaults to 60*60*24
 	 * @return bool
+	 * @throws \Exception
 	 */
 	public function add($key, $value, $ttl = 0) {
 		$result = self::$cache->add($this->getPrefix() . $key, $value, $ttl);
-		$this->verifyReturnCode();
+		if (self::$cache->getResultCode() !== \Memcached::RES_NOTSTORED) {
+			$this->verifyReturnCode();
+		}
 		return $result;
 	}
 
@@ -141,7 +146,11 @@ class Memcached extends Cache implements IMemcache {
 	public function inc($key, $step = 1) {
 		$this->add($key, 0);
 		$result = self::$cache->increment($this->getPrefix() . $key, $step);
-		$this->verifyReturnCode();
+
+		if (self::$cache->getResultCode() !== \Memcached::RES_SUCCESS) {
+			return false;
+		}
+
 		return $result;
 	}
 
@@ -154,7 +163,11 @@ class Memcached extends Cache implements IMemcache {
 	 */
 	public function dec($key, $step = 1) {
 		$result = self::$cache->decrement($this->getPrefix() . $key, $step);
-		$this->verifyReturnCode();
+
+		if (self::$cache->getResultCode() !== \Memcached::RES_SUCCESS) {
+			return false;
+		}
+
 		return $result;
 	}
 
diff --git a/tests/lib/memcache/cache.php b/tests/lib/memcache/cache.php
index 3ff72ee931c..725b0fbbf57 100644
--- a/tests/lib/memcache/cache.php
+++ b/tests/lib/memcache/cache.php
@@ -39,6 +39,11 @@ abstract class Cache extends \Test_Cache {
 		$this->assertFalse($this->instance->hasKey('foo'));
 	}
 
+	public function testRemoveNonExisting() {
+		$this->instance->remove('foo');
+		$this->assertFalse($this->instance->hasKey('foo'));
+	}
+
 	public function testArrayAccessSet() {
 		$this->instance['foo'] = 'bar';
 		$this->assertEquals('bar', $this->instance->get('foo'));
@@ -72,7 +77,9 @@ abstract class Cache extends \Test_Cache {
 		$this->assertEquals(1, $this->instance->inc('foo'));
 		$this->assertEquals(1, $this->instance->get('foo'));
 		$this->assertEquals(2, $this->instance->inc('foo'));
+		$this->assertEquals(2, $this->instance->get('foo'));
 		$this->assertEquals(12, $this->instance->inc('foo', 10));
+		$this->assertEquals(12, $this->instance->get('foo'));
 
 		$this->instance->set('foo', 'bar');
 		$this->assertFalse($this->instance->inc('foo'));
@@ -80,7 +87,7 @@ abstract class Cache extends \Test_Cache {
 	}
 
 	public function testDec() {
-		$this->assertEquals(false, $this->instance->dec('foo'));
+		$this->assertFalse($this->instance->dec('foo'));
 		$this->instance->set('foo', 20);
 		$this->assertEquals(19, $this->instance->dec('foo'));
 		$this->assertEquals(19, $this->instance->get('foo'));
-- 
GitLab