76 parent::__construct( $config );
78 $this->dbServers = $config[
'dbServers'];
80 $this->srvsByBucket = array_filter( $config[
'dbsByBucket'],
'is_array' );
81 $this->srvsByBucket = array_values( $this->srvsByBucket );
83 if ( isset( $config[
'lockExpiry'] ) ) {
84 $this->lockExpiry = $config[
'lockExpiry'];
86 $met = ini_get(
'max_execution_time' );
87 $this->lockExpiry = $met ?: 60;
89 $this->safeDelay = ( $this->lockExpiry <= 0 )
95 $this->statusCache = $config[
'srvCache'] ??
new HashBagOStuff();
106 $status = StatusValue::newGood();
107 foreach ( $pathsByType as
$type => $paths ) {
121 return StatusValue::newGood();
153 if ( !isset( $this->conns[$lockDb] ) ) {
154 if ( $this->dbServers[$lockDb] instanceof
IDatabase ) {
156 $db = $this->dbServers[$lockDb];
157 } elseif ( is_array( $this->dbServers[$lockDb] ) ) {
159 $config = $this->dbServers[$lockDb];
160 $config[
'flags'] = ( $config[
'flags'] ?? 0 );
161 $config[
'flags'] &= ~( IDatabase::DBO_TRX | IDatabase::DBO_DEFAULT );
162 $db = Database::factory( $config[
'type'], $config );
164 throw new UnexpectedValueException(
"No server called '$lockDb'." );
166 # If the connection drops, try to avoid letting the DB rollback
167 # and release the locks before the file operations are finished.
168 # This won't handle the case of DB server restarts however.
170 if ( $this->lockExpiry > 0 ) {
173 $db->setSessionOptions( $options );
176 $this->conns[$lockDb] = $db;
179 return $this->conns[$lockDb];
201 return ( $this->safeDelay > 0 )
202 ? !$this->statusCache->get( $this->
getMissKey( $lockDb ) )
213 return ( $this->safeDelay > 0 )
214 ? $this->statusCache->set( $this->
getMissKey( $lockDb ), 1, $this->safeDelay )
225 return 'dblockmanager:downservers:' . str_replace(
' ',
'_', $lockDb );
233 foreach ( $this->conns as $db ) {
234 $db->close( __METHOD__ );
Class representing a cache/ephemeral data store.
Version of LockManager based on using named/row DB locks.
__destruct()
Make sure remaining locks get cleared for sanity.
cacheRecordFailure( $lockDb)
Log a lock request failure to the cache.
IDatabase[] $conns
Map Database connections (DB name => Database)
freeLocksOnServer( $lockSrv, array $pathsByType)
Get a connection to a lock server and release locks on $paths.Subclasses must effectively implement t...
getMissKey( $lockDb)
Get a cache key for recent query misses for a DB.
getConnection( $lockDb)
Get (or reuse) a connection to a lock DB.
initConnection( $lockDb, IDatabase $db)
Do additional initialization for new lock DB connection Stable to override.
getLocksOnServer( $lockSrv, array $pathsByType)
array[] IDatabase[] $dbServers
Map of (DB names => server config or IDatabase)
__construct(array $config)
Construct a new instance from configuration.
doGetLocksOnServer( $lockSrv, array $paths, $type)
cacheCheckFailures( $lockDb)
Checks if the DB has not recently had connection/query errors.
Simple store for keeping values in an associative array for the current process.
Version of LockManager that uses a quorum from peer servers for locks.
releaseAllLocks()
Release all locks that this session is holding.