Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
25.00% covered (danger)
25.00%
3 / 12
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
Lock
25.00% covered (danger)
25.00%
3 / 12
50.00% covered (danger)
50.00%
1 / 2
21.19
0.00% covered (danger)
0.00%
0 / 1
 attempt
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
12
 remove
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2/**
3 * Lock class.
4 *
5 * @package automattic/jetpack-sync
6 */
7
8namespace Automattic\Jetpack\Sync;
9
10/**
11 * Lock class
12 */
13class Lock {
14    /**
15     * Prefix of the blog lock transient.
16     *
17     * @access public
18     *
19     * @var string
20     */
21    const LOCK_PREFIX = 'jp_sync_lock_';
22
23    /**
24     * Default Lifetime of the lock.
25     * This is the expiration value as such we are setting it high to handle cases where there are
26     * long running requests. Short expiration value leads to concurrent requests and performance issues.
27     *
28     * @access public
29     *
30     * @var int
31     */
32    const LOCK_TRANSIENT_EXPIRY = 180; // Seconds.
33
34    /**
35     * Attempt to lock.
36     *
37     * @access public
38     *
39     * @param string $name lock name.
40     * @param int    $expiry lock duration in seconds.
41     *
42     * @return boolean True if succeeded, false otherwise.
43     */
44    public function attempt( $name, $expiry = self::LOCK_TRANSIENT_EXPIRY ) {
45        $lock_name   = self::LOCK_PREFIX . $name;
46        $locked_time = get_option( $lock_name );
47
48        if ( $locked_time ) {
49            // If expired update to false but don't send. Send will occurr in new request to avoid race conditions.
50            if ( microtime( true ) > $locked_time ) {
51                update_option( $lock_name, false, false );
52            }
53            return false;
54        }
55
56        $locked_time = microtime( true ) + $expiry;
57        update_option( $lock_name, $locked_time, false );
58        return $locked_time;
59    }
60
61    /**
62     * Remove the lock.
63     *
64     * @access public
65     *
66     * @param string     $name                 lock name.
67     * @param bool|float $lock_expiration lock expiration.
68     */
69    public function remove( $name, $lock_expiration = false ) {
70        $lock_name = self::LOCK_PREFIX . $name;
71
72        // Only remove lock if current value matches our lock.
73        if ( true === $lock_expiration || (string) get_option( $lock_name ) === (string) $lock_expiration ) {
74            update_option( $lock_name, false, false );
75        }
76    }
77}