74 parent::__construct( $config );
76 $this->dbServers = $config[
'dbServers'];
78 $this->srvsByBucket = array_filter( $config[
'dbsByBucket'],
'is_array' );
79 $this->srvsByBucket = array_values( $this->srvsByBucket );
81 if ( isset( $config[
'lockExpiry'] ) ) {
82 $this->lockExpiry = $config[
'lockExpiry'];
84 $met = ini_get(
'max_execution_time' );
85 $this->lockExpiry = $met ?: 60;
87 $this->safeDelay = ( $this->lockExpiry <= 0 )
93 $this->statusCache = $config[
'srvCache'] ??
new HashBagOStuff();
103 $status = StatusValue::newGood();
104 foreach ( $pathsByType as
$type => $paths ) {
114 return StatusValue::newGood();
146 if ( !isset( $this->conns[$lockDb] ) ) {
147 if ( $this->dbServers[$lockDb] instanceof
IDatabase ) {
149 $db = $this->dbServers[$lockDb];
150 } elseif ( is_array( $this->dbServers[$lockDb] ) ) {
152 $config = $this->dbServers[$lockDb];
153 $config[
'flags'] = ( $config[
'flags'] ?? 0 );
154 $config[
'flags'] &= ~( IDatabase::DBO_TRX | IDatabase::DBO_DEFAULT );
155 $db = Database::factory( $config[
'type'], $config );
157 throw new UnexpectedValueException(
"No server called '$lockDb'." );
159 # If the connection drops, try to avoid letting the DB rollback
160 # and release the locks before the file operations are finished.
161 # This won't handle the case of DB server restarts however.
163 if ( $this->lockExpiry > 0 ) {
166 $db->setSessionOptions( $options );
169 $this->conns[$lockDb] = $db;
172 return $this->conns[$lockDb];
193 return ( $this->safeDelay > 0 )
194 ? !$this->statusCache->get( $this->
getMissKey( $lockDb ) )
205 return ( $this->safeDelay > 0 )
206 ? $this->statusCache->set( $this->
getMissKey( $lockDb ), 1, $this->safeDelay )
217 return 'dblockmanager:downservers:' . str_replace(
' ',
'_', $lockDb );
225 foreach ( $this->conns as $db ) {
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.
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.
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.