objectcache: add BagOStuff::fieldHasFlags() convenience method
authorAaron Schulz <aschulz@wikimedia.org>
Thu, 22 Aug 2019 04:23:30 +0000 (21:23 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Thu, 22 Aug 2019 22:07:14 +0000 (15:07 -0700)
Change-Id: Id2bf4ec0dd0999f988b70a895003c4b1aaae51a2

includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/CachedBagOStuff.php
includes/libs/objectcache/MediumSpecificBagOStuff.php
includes/libs/objectcache/MemcachedPeclBagOStuff.php
includes/libs/objectcache/MultiWriteBagOStuff.php
includes/libs/objectcache/ReplicatedBagOStuff.php
includes/objectcache/SqlBagOStuff.php

index da60c01..73904e4 100644 (file)
@@ -478,6 +478,16 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
                return INF;
        }
 
+       /**
+        * @param int $field
+        * @param int $flags
+        * @return bool
+        * @since 1.34
+        */
+       final protected function fieldHasFlags( $field, $flags ) {
+               return ( ( $field & $flags ) === $flags );
+       }
+
        /**
         * Merge the flag maps of one or more BagOStuff objects into a "lowest common denominator" map
         *
index 9fa9a89..b1d2b6c 100644 (file)
@@ -87,7 +87,7 @@ class CachedBagOStuff extends BagOStuff {
 
        public function set( $key, $value, $exptime = 0, $flags = 0 ) {
                $this->procCache->set( $key, $value, $exptime, $flags );
-               if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+               if ( !$this->fieldHasFlags( $flags, self::WRITE_CACHE_ONLY ) ) {
                        $this->backend->set( $key, $value, $exptime, $flags );
                }
 
@@ -96,7 +96,7 @@ class CachedBagOStuff extends BagOStuff {
 
        public function delete( $key, $flags = 0 ) {
                $this->procCache->delete( $key, $flags );
-               if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+               if ( !$this->fieldHasFlags( $flags, self::WRITE_CACHE_ONLY ) ) {
                        $this->backend->delete( $key, $flags );
                }
 
@@ -166,7 +166,8 @@ class CachedBagOStuff extends BagOStuff {
 
        public function setMulti( array $data, $exptime = 0, $flags = 0 ) {
                $this->procCache->setMulti( $data, $exptime, $flags );
-               if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+
+               if ( !$this->fieldHasFlags( $flags, self::WRITE_CACHE_ONLY ) ) {
                        return $this->backend->setMulti( $data, $exptime, $flags );
                }
 
@@ -175,7 +176,8 @@ class CachedBagOStuff extends BagOStuff {
 
        public function deleteMulti( array $keys, $flags = 0 ) {
                $this->procCache->deleteMulti( $keys, $flags );
-               if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+
+               if ( !$this->fieldHasFlags( $flags, self::WRITE_CACHE_ONLY ) ) {
                        return $this->backend->deleteMulti( $keys, $flags );
                }
 
@@ -184,7 +186,8 @@ class CachedBagOStuff extends BagOStuff {
 
        public function changeTTLMulti( array $keys, $exptime, $flags = 0 ) {
                $this->procCache->changeTTLMulti( $keys, $exptime, $flags );
-               if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+
+               if ( !$this->fieldHasFlags( $flags, self::WRITE_CACHE_ONLY ) ) {
                        return $this->backend->changeTTLMulti( $keys, $exptime, $flags );
                }
 
index 329e600..1242501 100644 (file)
@@ -188,7 +188,7 @@ abstract class MediumSpecificBagOStuff extends BagOStuff {
         * @return bool True if the item was deleted or not found, false on failure
         */
        public function delete( $key, $flags = 0 ) {
-               if ( ( $flags & self::WRITE_PRUNE_SEGMENTS ) != self::WRITE_PRUNE_SEGMENTS ) {
+               if ( !$this->fieldHasFlags( $flags, self::WRITE_PRUNE_SEGMENTS ) ) {
                        return $this->doDelete( $key, $flags );
                }
 
@@ -598,9 +598,10 @@ abstract class MediumSpecificBagOStuff extends BagOStuff {
         * @since 1.24
         */
        public function setMulti( array $data, $exptime = 0, $flags = 0 ) {
-               if ( ( $flags & self::WRITE_ALLOW_SEGMENTS ) === self::WRITE_ALLOW_SEGMENTS ) {
+               if ( $this->fieldHasFlags( $flags, self::WRITE_ALLOW_SEGMENTS ) ) {
                        throw new InvalidArgumentException( __METHOD__ . ' got WRITE_ALLOW_SEGMENTS' );
                }
+
                return $this->doSetMulti( $data, $exptime, $flags );
        }
 
@@ -615,6 +616,7 @@ abstract class MediumSpecificBagOStuff extends BagOStuff {
                foreach ( $data as $key => $value ) {
                        $res = $this->doSet( $key, $value, $exptime, $flags ) && $res;
                }
+
                return $res;
        }
 
@@ -629,9 +631,10 @@ abstract class MediumSpecificBagOStuff extends BagOStuff {
         * @since 1.33
         */
        public function deleteMulti( array $keys, $flags = 0 ) {
-               if ( ( $flags & self::WRITE_ALLOW_SEGMENTS ) === self::WRITE_ALLOW_SEGMENTS ) {
-                       throw new InvalidArgumentException( __METHOD__ . ' got WRITE_ALLOW_SEGMENTS' );
+               if ( $this->fieldHasFlags( $flags, self::WRITE_PRUNE_SEGMENTS ) ) {
+                       throw new InvalidArgumentException( __METHOD__ . ' got WRITE_PRUNE_SEGMENTS' );
                }
+
                return $this->doDeleteMulti( $keys, $flags );
        }
 
@@ -807,7 +810,7 @@ abstract class MediumSpecificBagOStuff extends BagOStuff {
                $usable = true;
 
                if (
-                       ( $flags & self::WRITE_ALLOW_SEGMENTS ) === self::WRITE_ALLOW_SEGMENTS &&
+                       $this->fieldHasFlags( $flags, self::WRITE_ALLOW_SEGMENTS ) &&
                        !is_int( $value ) && // avoid breaking incr()/decr()
                        is_finite( $this->segmentationSize )
                ) {
index 3df483d..12c1a7a 100644 (file)
@@ -332,7 +332,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
                // The PECL implementation is a naïve for-loop so use async I/O to pipeline;
                // https://github.com/php-memcached-dev/php-memcached/blob/master/php_memcached.c#L1852
-               if ( ( $flags & self::WRITE_BACKGROUND ) == self::WRITE_BACKGROUND ) {
+               if ( $this->fieldHasFlags( $flags, self::WRITE_BACKGROUND ) ) {
                        $client = $this->acquireAsyncClient();
                        $result = $client->setMulti( $data, $exptime );
                        $this->releaseAsyncClient( $client );
@@ -352,7 +352,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
                // The PECL implementation is a naïve for-loop so use async I/O to pipeline;
                // https://github.com/php-memcached-dev/php-memcached/blob/7443d16d02fb73cdba2e90ae282446f80969229c/php_memcached.c#L1852
-               if ( ( $flags & self::WRITE_BACKGROUND ) == self::WRITE_BACKGROUND ) {
+               if ( $this->fieldHasFlags( $flags, self::WRITE_BACKGROUND ) ) {
                        $client = $this->acquireAsyncClient();
                        $resultArray = $client->deleteMulti( $keys ) ?: [];
                        $this->releaseAsyncClient( $client );
index d150880..31d73e1 100644 (file)
@@ -106,7 +106,7 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        public function get( $key, $flags = 0 ) {
-               if ( ( $flags & self::READ_LATEST ) == self::READ_LATEST ) {
+               if ( $this->fieldHasFlags( $flags, self::READ_LATEST ) ) {
                        // If the latest write was a delete(), we do NOT want to fallback
                        // to the other tiers and possibly see the old value. Also, this
                        // is used by merge(), which only needs to hit the primary.
@@ -125,7 +125,7 @@ class MultiWriteBagOStuff extends BagOStuff {
 
                if ( $value !== false
                        && $missIndexes
-                       && ( $flags & self::READ_VERIFIED ) == self::READ_VERIFIED
+                       && $this->fieldHasFlags( $flags, self::READ_VERIFIED )
                ) {
                        // Backfill the value to the higher (and often faster/smaller) cache tiers
                        $this->doWrite(
@@ -346,7 +346,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool
         */
        protected function usesAsyncWritesGivenFlags( $flags ) {
-               return ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC ) ? false : $this->asyncWrites;
+               return $this->fieldHasFlags( $flags, self::WRITE_SYNC ) ? false : $this->asyncWrites;
        }
 
        public function makeKeyInternal( $keyspace, $args ) {
index 504d515..e3ced0d 100644 (file)
@@ -76,7 +76,7 @@ class ReplicatedBagOStuff extends BagOStuff {
        }
 
        public function get( $key, $flags = 0 ) {
-               return ( ( $flags & self::READ_LATEST ) == self::READ_LATEST )
+               return $this->fieldHasFlags( $flags, self::READ_LATEST )
                        ? $this->writeStore->get( $key, $flags )
                        : $this->readStore->get( $key, $flags );
        }
@@ -118,7 +118,7 @@ class ReplicatedBagOStuff extends BagOStuff {
        }
 
        public function getMulti( array $keys, $flags = 0 ) {
-               return ( ( $flags & self::READ_LATEST ) == self::READ_LATEST )
+               return $this->fieldHasFlags( $flags, self::READ_LATEST )
                        ? $this->writeStore->getMulti( $keys, $flags )
                        : $this->readStore->getMulti( $keys, $flags );
        }
index d9fe319..84051e0 100644 (file)
@@ -391,7 +391,7 @@ class SqlBagOStuff extends MediumSpecificBagOStuff {
                        }
                }
 
-               if ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC ) {
+               if ( $this->fieldHasFlags( $flags, self::WRITE_SYNC ) ) {
                        $result = $this->waitForReplication() && $result;
                }
 
@@ -556,7 +556,7 @@ class SqlBagOStuff extends MediumSpecificBagOStuff {
 
        public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
                $ok = $this->mergeViaCas( $key, $callback, $exptime, $attempts, $flags );
-               if ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC ) {
+               if ( $this->fieldHasFlags( $flags, self::WRITE_SYNC ) ) {
                        $ok = $this->waitForReplication() && $ok;
                }