From 7a730a6f9e34fe43eee2dd98cc82e52e5a5c9e52 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Thu, 31 May 2018 14:41:02 -0700 Subject: [PATCH] objectcache: update MemcachedPeclBagOStuff for pecl memcached 3.0.0 The get() $cas_token parameter was changed into $flags, which can act as a switch to make the return value an associative array of details. pecl and PHP-based memcached BagOStuff class both pass all tests now. Bug: T196125 Change-Id: I4678250331a48db4d50d1fc6c489c991a4dee920 --- .../libs/objectcache/MemcachedPeclBagOStuff.php | 14 +++++++++++++- .../libs/objectcache/MemcachedPhpBagOStuff.php | 4 ++-- .../includes/libs/objectcache/BagOStuffTest.php | 4 ++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/includes/libs/objectcache/MemcachedPeclBagOStuff.php b/includes/libs/objectcache/MemcachedPeclBagOStuff.php index e3e66d5826..fe31c258b2 100644 --- a/includes/libs/objectcache/MemcachedPeclBagOStuff.php +++ b/includes/libs/objectcache/MemcachedPeclBagOStuff.php @@ -140,7 +140,19 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff { protected function getWithToken( $key, &$casToken, $flags = 0 ) { $this->debugLog( "get($key)" ); - $result = $this->client->get( $this->validateKeyEncoding( $key ), null, $casToken ); + if ( defined( Memcached::class . '::GET_EXTENDED' ) ) { // v3.0.0 + $flags = Memcached::GET_EXTENDED; + $res = $this->client->get( $this->validateKeyEncoding( $key ), null, $flags ); + if ( is_array( $res ) ) { + $result = $res['value']; + $casToken = $res['cas']; + } else { + $result = false; + $casToken = null; + } + } else { + $result = $this->client->get( $this->validateKeyEncoding( $key ), null, $casToken ); + } $result = $this->checkResult( $key, $result ); return $result; } diff --git a/includes/libs/objectcache/MemcachedPhpBagOStuff.php b/includes/libs/objectcache/MemcachedPhpBagOStuff.php index e2d9d9394c..3ff390b813 100644 --- a/includes/libs/objectcache/MemcachedPhpBagOStuff.php +++ b/includes/libs/objectcache/MemcachedPhpBagOStuff.php @@ -62,12 +62,12 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff { public function incr( $key, $value = 1 ) { $this->validateKeyEncoding( $key ); - return $this->client->incr( $key, $value ); + return $this->client->incr( $key, $value ) ?? false; } public function decr( $key, $value = 1 ) { $this->validateKeyEncoding( $key ); - return $this->client->decr( $key, $value ); + return $this->client->decr( $key, $value ) ?? false; } } diff --git a/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php index d5702972f4..b6709a0f29 100644 --- a/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php +++ b/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php @@ -76,12 +76,12 @@ class BagOStuffTest extends MediaWikiTestCase { // merge on non-existing value $merged = $this->cache->merge( $key, $callback, 5 ); $this->assertTrue( $merged ); - $this->assertEquals( $this->cache->get( $key ), 'merged' ); + $this->assertEquals( 'merged', $this->cache->get( $key ) ); // merge on existing value $merged = $this->cache->merge( $key, $callback, 5 ); $this->assertTrue( $merged ); - $this->assertEquals( $this->cache->get( $key ), 'mergedmerged' ); + $this->assertEquals( 'mergedmerged', $this->cache->get( $key ) ); } /** -- 2.20.1