summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/jetpack_vendor/automattic/jetpack-sync/src/class-lock.php')
-rw-r--r--plugins/jetpack/jetpack_vendor/automattic/jetpack-sync/src/class-lock.php77
1 files changed, 77 insertions, 0 deletions
diff --git a/plugins/jetpack/jetpack_vendor/automattic/jetpack-sync/src/class-lock.php b/plugins/jetpack/jetpack_vendor/automattic/jetpack-sync/src/class-lock.php
new file mode 100644
index 00000000..61b89a1c
--- /dev/null
+++ b/plugins/jetpack/jetpack_vendor/automattic/jetpack-sync/src/class-lock.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Lock class.
+ *
+ * @package automattic/jetpack-sync
+ */
+
+namespace Automattic\Jetpack\Sync;
+
+/**
+ * Lock class
+ */
+class Lock {
+ /**
+ * Prefix of the blog lock transient.
+ *
+ * @access public
+ *
+ * @var string
+ */
+ const LOCK_PREFIX = 'jp_sync_lock_';
+
+ /**
+ * Default Lifetime of the lock.
+ * This is the expiration value as such we are setting it high to handle cases where there are
+ * long running requests. Short expiration value leads to concurrent requests and performance issues.
+ *
+ * @access public
+ *
+ * @var int
+ */
+ const LOCK_TRANSIENT_EXPIRY = 180; // Seconds.
+
+ /**
+ * Attempt to lock.
+ *
+ * @access public
+ *
+ * @param string $name lock name.
+ * @param int $expiry lock duration in seconds.
+ *
+ * @return boolean True if succeeded, false otherwise.
+ */
+ public function attempt( $name, $expiry = self::LOCK_TRANSIENT_EXPIRY ) {
+ $lock_name = self::LOCK_PREFIX . $name;
+ $locked_time = get_option( $lock_name );
+
+ if ( $locked_time ) {
+ // If expired update to false but don't send. Send will occurr in new request to avoid race conditions.
+ if ( microtime( true ) > $locked_time ) {
+ update_option( $lock_name, false, false );
+ }
+ return false;
+ }
+
+ $locked_time = microtime( true ) + $expiry;
+ update_option( $lock_name, $locked_time, false );
+ return $locked_time;
+ }
+
+ /**
+ * Remove the lock.
+ *
+ * @access public
+ *
+ * @param string $name lock name.
+ * @param bool|float $lock_expiration lock expiration.
+ */
+ public function remove( $name, $lock_expiration = false ) {
+ $lock_name = self::LOCK_PREFIX . $name;
+
+ // Only remove lock if current value matches our lock.
+ if ( true === $lock_expiration || (string) get_option( $lock_name ) === (string) $lock_expiration ) {
+ update_option( $lock_name, false, false );
+ }
+ }
+}