X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Flibs%2Fobjectcache%2FMediumSpecificBagOStuff.php;h=9d361876ce388f2ac8ad5e753b8ae581e2302dea;hb=4334e1cc02b9749e92c514bd2aa46b347010f913;hp=329e600bb5728827984e01068d556c271a4c4154;hpb=90d6f495bd099d58a3f9fb2ce97f4957f161255f;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/libs/objectcache/MediumSpecificBagOStuff.php b/includes/libs/objectcache/MediumSpecificBagOStuff.php index 329e600bb5..9d361876ce 100644 --- a/includes/libs/objectcache/MediumSpecificBagOStuff.php +++ b/includes/libs/objectcache/MediumSpecificBagOStuff.php @@ -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 ); } @@ -208,7 +208,7 @@ abstract class MediumSpecificBagOStuff extends BagOStuff { $mainValue->{SerializedValueContainer::SEGMENTED_HASHES} ); - return $this->deleteMulti( $orderedKeys, $flags ); + return $this->deleteMulti( $orderedKeys, $flags & ~self::WRITE_PRUNE_SEGMENTS ); } /** @@ -269,12 +269,12 @@ abstract class MediumSpecificBagOStuff extends BagOStuff { final protected function mergeViaCas( $key, callable $callback, $exptime, $attempts, $flags ) { $attemptsLeft = $attempts; do { - $casToken = null; // passed by reference + $token = null; // passed by reference // Get the old value and CAS token from cache $this->clearLastError(); $currentValue = $this->resolveSegments( $key, - $this->doGet( $key, self::READ_LATEST, $casToken ) + $this->doGet( $key, $flags, $token ) ); if ( $this->getLastError() ) { // Don't spam slow retries due to network problems (retry only on races) @@ -293,7 +293,7 @@ abstract class MediumSpecificBagOStuff extends BagOStuff { unset( $currentValue ); // free RAM in case the value is large $this->clearLastError(); - if ( $value === false ) { + if ( $value === false || $exptime < 0 ) { $success = true; // do nothing } elseif ( $valueMatchesOldValue && $attemptsLeft !== $attempts ) { $success = true; // recently set by another thread to the same value @@ -302,7 +302,7 @@ abstract class MediumSpecificBagOStuff extends BagOStuff { $success = $this->add( $key, $value, $exptime, $flags ); } else { // Try to update the key, failing if it gets changed in the meantime - $success = $this->cas( $casToken, $key, $value, $exptime, $flags ); + $success = $this->cas( $token, $key, $value, $exptime, $flags ); } if ( $this->getLastError() ) { // Don't spam slow retries due to network problems (retry only on races) @@ -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 ); } @@ -668,37 +671,16 @@ abstract class MediumSpecificBagOStuff extends BagOStuff { return $res; } - /** - * Decrease stored value of $key by $value while preserving its TTL - * @param string $key - * @param int $value Value to subtract from $key (default: 1) [optional] - * @return int|bool New value or false on failure - */ - public function decr( $key, $value = 1 ) { - return $this->incr( $key, -$value ); - } - - /** - * Increase stored value of $key by $value while preserving its TTL - * - * This will create the key with value $init and TTL $ttl instead if not present - * - * @param string $key - * @param int $ttl - * @param int $value - * @param int $init - * @return int|bool New value or false on failure - * @since 1.24 - */ - public function incrWithInit( $key, $ttl, $value = 1, $init = 1 ) { + public function incrWithInit( $key, $exptime, $value = 1, $init = null, $flags = 0 ) { + $init = is_int( $init ) ? $init : $value; $this->clearLastError(); - $newValue = $this->incr( $key, $value ); + $newValue = $this->incr( $key, $value, $flags ); if ( $newValue === false && !$this->getLastError() ) { // No key set; initialize - $newValue = $this->add( $key, (int)$init, $ttl ) ? $init : false; + $newValue = $this->add( $key, (int)$init, $exptime, $flags ) ? $init : false; if ( $newValue === false && !$this->getLastError() ) { // Raced out initializing; increment - $newValue = $this->incr( $key, $value ); + $newValue = $this->incr( $key, $value, $flags ); } } @@ -768,26 +750,6 @@ abstract class MediumSpecificBagOStuff extends BagOStuff { $this->lastError = $err; } - /** - * Let a callback be run to avoid wasting time on special blocking calls - * - * The callbacks may or may not be called ever, in any particular order. - * They are likely to be invoked when something WRITE_SYNC is used used. - * They should follow a caching pattern as shown below, so that any code - * using the work will get it's result no matter what happens. - * @code - * $result = null; - * $workCallback = function () use ( &$result ) { - * if ( !$result ) { - * $result = .... - * } - * return $result; - * } - * @endcode - * - * @param callable $workCallback - * @since 1.28 - */ final public function addBusyCallback( callable $workCallback ) { $this->busyCallbacks[] = $workCallback; } @@ -807,7 +769,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 ) ) { @@ -919,14 +881,6 @@ abstract class MediumSpecificBagOStuff extends BagOStuff { return ( $value === (string)$integer ); } - /** - * Construct a cache key. - * - * @param string $keyspace - * @param array $args - * @return string Colon-delimited list of $keyspace followed by escaped components of $args - * @since 1.27 - */ public function makeKeyInternal( $keyspace, $args ) { $key = $keyspace; foreach ( $args as $arg ) { @@ -968,18 +922,10 @@ abstract class MediumSpecificBagOStuff extends BagOStuff { return $this->attrMap[$flag] ?? self::QOS_UNKNOWN; } - /** - * @return int|float The chunk size, in bytes, of segmented objects (INF for no limit) - * @since 1.34 - */ public function getSegmentationSize() { return $this->segmentationSize; } - /** - * @return int|float Maximum total segmented object size in bytes (INF for no limit) - * @since 1.34 - */ public function getSegmentedValueMaxSize() { return $this->segmentedValueMaxSize; }