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 for sanity. More...
 
- Public Member Functions inherited from LockManager
 __construct (array $config)
 Construct a new instance from configuration. More...
 
 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)
 
 getLocksOnServer ( $lockSrv, array $pathsByType)
 
 isServerUp ( $lockSrv)
 
 recordKeyForPath ( $path, $type)
 
 releaseAllLocks ()
 
- 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)
 
 doLockByType (array $pathsByType)
 
 doLockingRequestBucket ( $bucket, array $pathsByType)
 Attempt to acquire locks with the peers for a bucket. More...
 
 doUnlock (array $paths, $type)
 
 doUnlockByType (array $pathsByType)
 
 doUnlockingRequestBucket ( $bucket, array $pathsByType)
 Attempt to release locks with the peers for a bucket. More...
 
 freeLocksOnServer ( $lockSrv, array $pathsByType)
 Get a connection to a lock server and release locks on $paths. More...
 
 getBucketFromPath ( $path)
 Get the bucket for resource path. 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...
 
 releaseAllLocks ()
 Release all locks that this session is holding. More...
 
 releasePledges ( $bucket, callable $callback)
 Attempt to release pledges with the peers for a bucket. More...
 
- Protected Member Functions inherited from LockManager
 doLock (array $paths, $type)
 Lock resources with the given keys and lock type. More...
 
 doLockByType (array $pathsByType)
 
 doUnlock (array $paths, $type)
 Unlock resources with the given keys and lock type. More...
 
 doUnlockByType (array $pathsByType)
 
 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...
 

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 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 : Array of 1-16 consecutive integer keys, starting from 0, each having an odd-numbered list of server names (peers) as values.
  • redisConfig : Configuration for RedisConnectionPool::__construct().
Exceptions
Exception

Definition at line 64 of file RedisLockManager.php.

References RedisConnectionPool\singleton().

◆ __destruct()

RedisLockManager::__destruct ( )

Make sure remaining locks get cleared for sanity.

Definition at line 265 of file RedisLockManager.php.

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

Member Function Documentation

◆ freeLocksOnServer()

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

◆ getLocksOnServer()

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

◆ isServerUp()

RedisLockManager::isServerUp (   $lockSrv)
protected

Definition at line 246 of file RedisLockManager.php.

◆ recordKeyForPath()

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

Definition at line 257 of file RedisLockManager.php.

References $path, and LockManager\sha1Base36Absolute().

Referenced by freeLocksOnServer(), and getLocksOnServer().

◆ releaseAllLocks()

RedisLockManager::releaseAllLocks ( )
protected

Definition at line 242 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

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: