You are here

public function Redis_Lock_Backend_Default::lockWait in Redis 7.2

Same name and namespace in other branches
  1. 7 lib/Redis/Lock/Backend/Default.php \Redis_Lock_Backend_Default::lockWait()

Default implementation from actual Drupal core.

Overrides Redis_Lock_Backend_Interface::lockWait

See also

Redis_Lock_Backend_Interface::lockWait()

File

lib/Redis/Lock/Backend/Default.php, line 28

Class

Redis_Lock_Backend_Default
Lock backend shared methods.

Code

public function lockWait($name, $delay = 30) {

  // Pause the process for short periods between calling
  // lock_may_be_available(). This prevents hitting the database with constant
  // database queries while waiting, which could lead to performance issues.
  // However, if the wait period is too long, there is the potential for a
  // large number of processes to be blocked waiting for a lock, especially
  // if the item being rebuilt is commonly requested. To address both of these
  // concerns, begin waiting for 25ms, then add 25ms to the wait period each
  // time until it reaches 500ms. After this point polling will continue every
  // 500ms until $delay is reached.
  // $delay is passed in seconds, but we will be using usleep(), which takes
  // microseconds as a parameter. Multiply it by 1 million so that all
  // further numbers are equivalent.
  $delay = (int) $delay * 1000000;

  // Begin sleeping at 25ms.
  $sleep = 25000;
  while ($delay > 0) {

    // This function should only be called by a request that failed to get a
    // lock, so we sleep first to give the parallel request a chance to finish
    // and release the lock.
    usleep($sleep);

    // After each sleep, increase the value of $sleep until it reaches
    // 500ms, to reduce the potential for a lock stampede.
    $delay = $delay - $sleep;
    $sleep = min(500000, $sleep + 25000, $delay);
    if ($this
      ->lockMayBeAvailable($name)) {

      // No longer need to wait.
      return FALSE;
    }
  }

  // The caller must still wait longer to get the lock.
  return TRUE;
}