From 01c63a5eb5608e9eb6579f2948c237752214cf1c 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 --- RELEASE-NOTES-1.31 | 1 + .../libs/objectcache/MemcachedPeclBagOStuff.php | 14 +++++++++++++- .../libs/objectcache/MemcachedPhpBagOStuff.php | 4 ++-- .../includes/libs/objectcache/BagOStuffTest.php | 4 ++-- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/RELEASE-NOTES-1.31 b/RELEASE-NOTES-1.31 index d369ac6ea0..01c3f210ba 100644 --- a/RELEASE-NOTES-1.31 +++ b/RELEASE-NOTES-1.31 @@ -410,6 +410,7 @@ changes to languages because of Phabricator reports. wikitext table captions, wikitext table headings, wikitext table cells. HTML headings, HTML list items, HTML table captions, HTML table headings, HTML table cells will not have this trimming behavior. +* (T196125) php-memcached 3.0 (provided with PHP 7.0) is now supported. == Compatibility == MediaWiki 1.31 requires PHP 7.0.0 or later. Although HHVM 3.18.5 or later is 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 4320d80249..10fba835a3 100644 --- a/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php +++ b/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php @@ -92,12 +92,12 @@ class BagOStuffTest extends MediaWikiTestCase { // merge on non-existing value $merged = $this->cache->merge( $key, $callback, 0 ); $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, 0 ); $this->assertTrue( $merged ); - $this->assertEquals( $this->cache->get( $key ), 'mergedmerged' ); + $this->assertEquals( 'mergedmerged', $this->cache->get( $key ) ); /* * Test concurrent merges by forking this process, if: -- 2.20.1