MediaWiki  master
RedisLockManager Class Reference

Manage locks using redis servers. More...

Inheritance diagram for RedisLockManager:
Collaboration diagram for RedisLockManager:

Public Member Functions

 __construct (array $config)
 Construct a new instance from configuration. More...
 
 __destruct ()
 Make sure remaining locks get cleared. More...
 
- Public Member Functions inherited from LockManager
 lock (array $paths, $type=self::LOCK_EX, $timeout=0)
 Lock the resources at the given abstract paths. More...
 
 lockByType (array $pathsByType, $timeout=0)
 Lock the resources at the given abstract paths. More...
 
 unlock (array $paths, $type=self::LOCK_EX)
 Unlock the resources at the given abstract paths. More...
 
 unlockByType (array $pathsByType)
 Unlock the resources at the given abstract paths. More...
 

Protected Member Functions

 freeLocksOnServer ( $lockSrv, array $pathsByType)
 Get a connection to a lock server and release locks on $paths. More...
 
 getLocksOnServer ( $lockSrv, array $pathsByType)
 Get a connection to a lock server and acquire locks. More...
 
 isServerUp ( $lockSrv)
 Check if a lock server is up. More...
 
 recordKeyForPath ( $path, $type)
 
 releaseAllLocks ()
 Release all locks that this session is holding. More...
 
- Protected Member Functions inherited from QuorumLockManager
 collectPledgeQuorum ( $bucket, callable $callback)
 Attempt to acquire pledges with the peers for a bucket. More...
 
 doLock (array $paths, $type)
 Lock resources with the given keys and lock type. More...
 
 doLockByType (array $pathsByType)
 
 doLockingRequestBucket ( $bucket, array $pathsByType)
 Attempt to acquire locks with the peers for a bucket. More...
 
 doUnlock (array $paths, $type)
 Unlock resources with the given keys and lock type. More...
 
 doUnlockByType (array $pathsByType)
 
 doUnlockingRequestBucket ( $bucket, array $pathsByType)
 Attempt to release locks with the peers for a bucket. More...
 
 getBucketFromPath ( $path)
 Get the bucket for resource path. More...
 
 releasePledges ( $bucket, callable $callback)
 Attempt to release pledges with the peers for a bucket. More...
 
- Protected Member Functions inherited from LockManager
 normalizePathsByType (array $pathsByType)
 Normalize the $paths array by converting LOCK_UW locks into the appropriate type and removing any duplicated paths for each lock type. More...
 
 sha1Base16Absolute ( $path)
 Get the base 16 SHA-1 of a string, padded to 31 digits. More...
 
 sha1Base36Absolute ( $path)
 Get the base 36 SHA-1 of a string, padded to 31 digits. More...
 

Protected Attributes

array $lockServers = []
 Map server names to hostname/IP and port numbers. More...
 
array $lockTypeMap
 Mapping of lock types to the type actually used. More...
 
RedisConnectionPool $redisPool
 
- Protected Attributes inherited from QuorumLockManager
array $degradedBuckets = []
 Map of degraded buckets. More...
 
array $srvsByBucket = []
 Map of bucket indexes to peer server lists. More...
 
- Protected Attributes inherited from LockManager
 $domain
 
array $locksHeld = []
 Map of (resource path => lock type => count) More...
 
 $lockTTL
 
array $lockTypeMap
 Mapping of lock types to the type actually used. More...
 
LoggerInterface $logger
 
string $session
 Random 32-char hex number. More...
 
const CLI_LOCK_TTL = 3600
 Default lock TTL in CLI mode. More...
 
const MAX_LOCK_TTL = 2 * 3600
 Max expected lock expiry in any context. More...
 
const MIN_GUESSED_LOCK_TTL = 5 * 60
 The minimum lock TTL if it is guessed from max_execution_time rather than configured. More...
 
const MIN_LOCK_TTL = 5
 Minimum lock TTL. More...
 

Additional Inherited Members

- Public Attributes inherited from LockManager
const LOCK_EX = 3
 
const LOCK_SH = 1
 Lock types; stronger locks have higher values. More...
 
const LOCK_UW = 2
 

Detailed Description

Manage locks using redis servers.

Version of LockManager based on using redis servers. This is meant for multi-wiki systems that may share files. All locks are non-blocking, which avoids deadlocks.

All lock requests for a resource, identified by a hash string, will map to one bucket. Each bucket maps to one or several peer servers, each running redis. A majority of peers must agree for a lock to be acquired.

This class requires Redis 2.6 as it makes use of Lua scripts for fast atomic operations.

Since
1.22

Definition at line 40 of file RedisLockManager.php.

Constructor & Destructor Documentation

◆ __construct()

RedisLockManager::__construct ( array  $config)

Construct a new instance from configuration.

Parameters
array$configParameters include:
  • lockServers : Associative array of server names to "<IP>:<port>" strings.
  • srvsByBucket : An array of up to 16 arrays, each containing the server names in a bucket. Each bucket should have an odd number of servers. If omitted, all servers will be in one bucket. (optional).
  • redisConfig : Configuration for RedisConnectionPool::singleton() (optional).
Exceptions
Exception

Reimplemented from LockManager.

Definition at line 65 of file RedisLockManager.php.

References RedisConnectionPool\singleton().

◆ __destruct()

RedisLockManager::__destruct ( )

Make sure remaining locks get cleared.

Definition at line 268 of file RedisLockManager.php.

References $path, $type, and LockManager\unlockByType().

Member Function Documentation

◆ freeLocksOnServer()

RedisLockManager::freeLocksOnServer (   $lockSrv,
array  $pathsByType 
)
protected

Get a connection to a lock server and release locks on $paths.

Subclasses must effectively implement this or releaseAllLocks().

Parameters
string$lockSrv
array$pathsByTypeMap of LockManager::LOCK_* constants to lists of paths
Returns
StatusValue

Reimplemented from QuorumLockManager.

Definition at line 174 of file RedisLockManager.php.

References $path, $res, $type, LockManager\LOCK_SH, StatusValue\newGood(), and recordKeyForPath().

◆ getLocksOnServer()

RedisLockManager::getLocksOnServer (   $lockSrv,
array  $pathsByType 
)
protected

Get a connection to a lock server and acquire locks.

Parameters
string$lockSrv
array$pathsByTypeMap of LockManager::LOCK_* constants to lists of paths
Returns
StatusValue

Reimplemented from QuorumLockManager.

Definition at line 81 of file RedisLockManager.php.

References $path, $res, $type, LockManager\lock(), LockManager\LOCK_SH, StatusValue\newGood(), and recordKeyForPath().

◆ isServerUp()

RedisLockManager::isServerUp (   $lockSrv)
protected

Check if a lock server is up.

This should process cache results to reduce RTT.

Parameters
string$lockSrv
Returns
bool

Reimplemented from QuorumLockManager.

Definition at line 249 of file RedisLockManager.php.

◆ recordKeyForPath()

RedisLockManager::recordKeyForPath (   $path,
  $type 
)
protected
Parameters
string$path
string$typeOne of (EX,SH)
Returns
string

Definition at line 260 of file RedisLockManager.php.

References $path, and LockManager\sha1Base36Absolute().

Referenced by freeLocksOnServer(), and getLocksOnServer().

◆ releaseAllLocks()

RedisLockManager::releaseAllLocks ( )
protected

Release all locks that this session is holding.

Subclasses must effectively implement this or freeLocksOnServer().

Returns
StatusValue

Reimplemented from QuorumLockManager.

Definition at line 245 of file RedisLockManager.php.

References StatusValue\newGood().

Member Data Documentation

◆ $lockServers

array RedisLockManager::$lockServers = []
protected

Map server names to hostname/IP and port numbers.

Definition at line 52 of file RedisLockManager.php.

◆ $lockTypeMap

array RedisLockManager::$lockTypeMap
protected
Initial value:
= [
self::LOCK_SH => self::LOCK_SH,
self::LOCK_UW => self::LOCK_SH,
self::LOCK_EX => self::LOCK_EX
]
const LOCK_SH
Lock types; stronger locks have higher values.
Definition: LockManager.php:70
const LOCK_EX
Definition: LockManager.php:72

Mapping of lock types to the type actually used.

Definition at line 42 of file RedisLockManager.php.

◆ $redisPool

RedisConnectionPool RedisLockManager::$redisPool
protected

Definition at line 49 of file RedisLockManager.php.


The documentation for this class was generated from the following file: