Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
2 / 2 |
CRAP | |
100.00% |
12 / 12 |
| LockBackendAbstract | |
100.00% |
1 / 1 |
|
100.00% |
2 / 2 |
5 | |
100.00% |
12 / 12 |
| wait | |
100.00% |
1 / 1 |
3 | |
100.00% |
9 / 9 |
|||
| getLockId | |
100.00% |
1 / 1 |
2 | |
100.00% |
3 / 3 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\Lock\LockBackendAbstract. | |
| */ | |
| namespace Drupal\Core\Lock; | |
| /** | |
| * Non backend related common methods implementation for lock backends. | |
| * | |
| * @ingroup lock | |
| */ | |
| abstract class LockBackendAbstract implements LockBackendInterface { | |
| /** | |
| * Current page lock token identifier. | |
| * | |
| * @var string | |
| */ | |
| protected $lockId; | |
| /** | |
| * Existing locks for this page. | |
| * | |
| * @var array | |
| */ | |
| protected $locks = array(); | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function wait($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; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getLockId() { | |
| if (!isset($this->lockId)) { | |
| $this->lockId = uniqid(mt_rand(), TRUE); | |
| } | |
| return $this->lockId; | |
| } | |
| } |