* @ingroup FileBackend
*/
use Psr\Log\LoggerInterface;
+use Wikimedia\WaitConditionLoop;
/**
* Resource locking handling.
*
* Locks on resource keys can either be shared or exclusive.
*
- * Implementations must keep track of what is locked by this proccess
+ * Implementations must keep track of what is locked by this process
* in-memory and support nested locking calls (using reference counting).
* At least LOCK_UW and LOCK_EX must be implemented. LOCK_SH can be a no-op.
* Locks should either be non-blocking or have low wait timeouts.
const LOCK_UW = 2; // shared lock (for reads used to write elsewhere)
const LOCK_EX = 3; // exclusive lock (for writes)
+ /** @var int Max expected lock expiry in any context */
+ const MAX_LOCK_TTL = 7200; // 2 hours
+
/**
* Construct a new instance from configuration
*
$this->lockTTL = max( 5 * 60, 2 * (int)$met );
}
+ // Upper bound on how long to keep lock structures around. This is useful when setting
+ // TTLs, as the "lockTTL" value may vary based on CLI mode and app server group. This is
+ // a "safe" value that can be used to avoid clobbering other locks that use high TTLs.
+ $this->lockTTL = min( $this->lockTTL, self::MAX_LOCK_TTL );
+
$random = [];
for ( $i = 1; $i <= 5; ++$i ) {
$random[] = mt_rand( 0, 0xFFFFFFF );
/**
* Get the base 36 SHA-1 of a string, padded to 31 digits.
* Before hashing, the path will be prefixed with the domain ID.
- * This should be used interally for lock key or file names.
+ * This should be used internally for lock key or file names.
*
* @param string $path
* @return string
/**
* Get the base 16 SHA-1 of a string, padded to 31 digits.
* Before hashing, the path will be prefixed with the domain ID.
- * This should be used interally for lock key or file names.
+ * This should be used internally for lock key or file names.
*
* @param string $path
* @return string