[Pkg-owncloud-commits] [owncloud] 394/457: add compare-and-delete to the memcache interface
David Prévot
taffit at moszumanska.debian.org
Sun Jun 28 20:06:53 UTC 2015
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch stable8
in repository owncloud.
commit ac9f998abdceb21fbbda4e8dee0e8b16c2f5ec4e
Author: Robin Appelman <icewind at owncloud.com>
Date: Mon Jun 8 15:25:23 2015 +0200
add compare-and-delete to the memcache interface
---
lib/private/memcache/apc.php | 2 +
lib/private/memcache/arraycache.php | 2 +
.../memcache/{nullcache.php => cadtrait.php} | 70 +++++++++-------------
lib/private/memcache/memcached.php | 2 +
lib/private/memcache/nullcache.php | 4 ++
lib/private/memcache/xcache.php | 2 +
lib/public/imemcache.php | 10 ++++
tests/lib/memcache/cache.php | 12 ++++
8 files changed, 63 insertions(+), 41 deletions(-)
diff --git a/lib/private/memcache/apc.php b/lib/private/memcache/apc.php
index 50b942e..f768cdc 100644
--- a/lib/private/memcache/apc.php
+++ b/lib/private/memcache/apc.php
@@ -31,6 +31,8 @@ class APC extends Cache implements IMemcache {
cas as casEmulated;
}
+ use CADTrait;
+
public function get($key) {
$result = apc_fetch($this->getPrefix() . $key, $success);
if (!$success) {
diff --git a/lib/private/memcache/arraycache.php b/lib/private/memcache/arraycache.php
index 2b1b87a..8a3fdd2 100644
--- a/lib/private/memcache/arraycache.php
+++ b/lib/private/memcache/arraycache.php
@@ -28,6 +28,8 @@ class ArrayCache extends Cache implements IMemcache {
/** @var array Array with the cached data */
protected $cachedData = array();
+ use CADTrait;
+
/**
* {@inheritDoc}
*/
diff --git a/lib/private/memcache/nullcache.php b/lib/private/memcache/cadtrait.php
similarity index 50%
copy from lib/private/memcache/nullcache.php
copy to lib/private/memcache/cadtrait.php
index 77eadba..e9836e2 100644
--- a/lib/private/memcache/nullcache.php
+++ b/lib/private/memcache/cadtrait.php
@@ -1,7 +1,6 @@
<?php
/**
- * @author Morris Jobke <hey at morrisjobke.de>
- * @author Robin McCorkell <rmccorkell at karoshi.org.uk>
+ * @author Robin Appelman <icewind at owncloud.com>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
* @license AGPL-3.0
@@ -22,44 +21,33 @@
namespace OC\Memcache;
-class NullCache extends Cache implements \OCP\IMemcache {
- public function get($key) {
- return null;
- }
-
- public function set($key, $value, $ttl = 0) {
- return true;
- }
-
- public function hasKey($key) {
- return false;
- }
-
- public function remove($key) {
- return true;
- }
-
- public function add($key, $value, $ttl = 0) {
- return true;
- }
-
- public function inc($key, $step = 1) {
- return true;
- }
-
- public function dec($key, $step = 1) {
- return true;
- }
-
- public function cas($key, $old, $new) {
- return true;
- }
-
- public function clear($prefix = '') {
- return true;
- }
-
- static public function isAvailable() {
- return true;
+trait CADTrait {
+ abstract public function get($key);
+
+ abstract public function remove($key);
+
+ abstract public function add($key, $value, $ttl = 0);
+
+ /**
+ * Compare and delete
+ *
+ * @param string $key
+ * @param mixed $old
+ * @return bool
+ */
+ public function cad($key, $old) {
+ //no native cas, emulate with locking
+ if ($this->add($key . '_lock', true)) {
+ if ($this->get($key) === $old) {
+ $this->remove($key);
+ $this->remove($key . '_lock');
+ return true;
+ } else {
+ $this->remove($key . '_lock');
+ return false;
+ }
+ } else {
+ return false;
+ }
}
}
diff --git a/lib/private/memcache/memcached.php b/lib/private/memcache/memcached.php
index cf1d651..1503851 100644
--- a/lib/private/memcache/memcached.php
+++ b/lib/private/memcache/memcached.php
@@ -34,6 +34,8 @@ class Memcached extends Cache implements IMemcache {
*/
private static $cache = null;
+ use CADTrait;
+
public function __construct($prefix = '') {
parent::__construct($prefix);
if (is_null(self::$cache)) {
diff --git a/lib/private/memcache/nullcache.php b/lib/private/memcache/nullcache.php
index 77eadba..f971ffc 100644
--- a/lib/private/memcache/nullcache.php
+++ b/lib/private/memcache/nullcache.php
@@ -55,6 +55,10 @@ class NullCache extends Cache implements \OCP\IMemcache {
return true;
}
+ public function cad($key, $old) {
+ return true;
+ }
+
public function clear($prefix = '') {
return true;
}
diff --git a/lib/private/memcache/xcache.php b/lib/private/memcache/xcache.php
index 0be79d0..a6265ed 100644
--- a/lib/private/memcache/xcache.php
+++ b/lib/private/memcache/xcache.php
@@ -34,6 +34,8 @@ use OCP\IMemcache;
class XCache extends Cache implements IMemcache {
use CASTrait;
+ use CADTrait;
+
/**
* entries in XCache gets namespaced to prevent collisions between ownCloud instances and users
*/
diff --git a/lib/public/imemcache.php b/lib/public/imemcache.php
index f8b898e..a1a0079 100644
--- a/lib/public/imemcache.php
+++ b/lib/public/imemcache.php
@@ -76,4 +76,14 @@ interface IMemcache extends ICache {
* @since 8.1.0
*/
public function cas($key, $old, $new);
+
+ /**
+ * Compare and delete
+ *
+ * @param string $key
+ * @param mixed $old
+ * @return bool
+ * @since 8.1.0
+ */
+ public function cad($key, $old);
}
diff --git a/tests/lib/memcache/cache.php b/tests/lib/memcache/cache.php
index 9d977cf..3ff72ee 100644
--- a/tests/lib/memcache/cache.php
+++ b/tests/lib/memcache/cache.php
@@ -103,6 +103,18 @@ abstract class Cache extends \Test_Cache {
$this->assertEquals('bar1', $this->instance->get('foo'));
}
+ public function testCadNotChanged() {
+ $this->instance->set('foo', 'bar');
+ $this->assertTrue($this->instance->cad('foo', 'bar'));
+ $this->assertFalse($this->instance->hasKey('foo'));
+ }
+
+ public function testCadChanged() {
+ $this->instance->set('foo', 'bar1');
+ $this->assertFalse($this->instance->cad('foo', 'bar'));
+ $this->assertTrue($this->instance->hasKey('foo'));
+ }
+
protected function tearDown() {
if ($this->instance) {
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git
More information about the Pkg-owncloud-commits
mailing list