From 740fcb4c58746d3b797bb2fa218c6edb40daeed7 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Sat, 17 Sep 2016 20:48:23 -0700 Subject: [PATCH] Remove wf* function dependencies from FSLockManager Change-Id: I52f08c6e7372ddbbcc1b5f82d505e435b01ff138 --- includes/db/DatabaseSqlite.php | 7 ++++++- includes/filebackend/lockmanager/FSLockManager.php | 13 +++++++++---- includes/filebackend/lockmanager/LockManager.php | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/includes/db/DatabaseSqlite.php b/includes/db/DatabaseSqlite.php index 28fb5b5db7..a52c2edf1a 100644 --- a/includes/db/DatabaseSqlite.php +++ b/includes/db/DatabaseSqlite.php @@ -69,8 +69,10 @@ class DatabaseSqlite extends DatabaseBase { // Super doesn't open when $user is false, but we can work with $dbName, // which is derived from the file path in this case. $this->openFile( $p['dbFilePath'] ); + $lockDomain = md5( $p['dbFilePath'] ); } else { $this->mDBname = $p['dbname']; + $lockDomain = $this->mDBname; // Stock wiki mode using standard file names per DB. parent::__construct( $p ); // Super doesn't open when $user is false, but we can work with $dbName @@ -96,7 +98,10 @@ class DatabaseSqlite extends DatabaseBase { wfWarn( "Invalid SQLite transaction mode provided." ); } - $this->lockMgr = new FSLockManager( [ 'lockDirectory' => "{$this->dbDir}/locks" ] ); + $this->lockMgr = new FSLockManager( [ + 'domain' => $lockDomain, + 'lockDirectory' => "{$this->dbDir}/locks" + ] ); } /** diff --git a/includes/filebackend/lockmanager/FSLockManager.php b/includes/filebackend/lockmanager/FSLockManager.php index 8e149d6380..b6629aa846 100644 --- a/includes/filebackend/lockmanager/FSLockManager.php +++ b/includes/filebackend/lockmanager/FSLockManager.php @@ -41,11 +41,15 @@ class FSLockManager extends LockManager { self::LOCK_EX => self::LOCK_EX ]; - protected $lockDir; // global dir for all servers + /** @var string Global dir for all servers */ + protected $lockDir; /** @var array Map of (locked key => lock file handle) */ protected $handles = []; + /** @var bool */ + protected $isWindows; + /** * Construct a new instance from configuration. * @@ -56,6 +60,7 @@ class FSLockManager extends LockManager { parent::__construct( $config ); $this->lockDir = $config['lockDirectory']; + $this->isWindows = ( strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN' ); } /** @@ -119,11 +124,11 @@ class FSLockManager extends LockManager { } else { MediaWiki\suppressWarnings(); $handle = fopen( $this->getLockPath( $path ), 'a+' ); - MediaWiki\restoreWarnings(); if ( !$handle ) { // lock dir missing? - wfMkdirParents( $this->lockDir ); + mkdir( $this->lockDir, 0777, true ); $handle = fopen( $this->getLockPath( $path ), 'a+' ); // try again } + MediaWiki\restoreWarnings(); } if ( $handle ) { // Either a shared or exclusive lock @@ -173,7 +178,7 @@ class FSLockManager extends LockManager { } // Unlock handles to release locks and delete // any lock files that end up with no locks on them... - if ( wfIsWindows() ) { + if ( $this->isWindows ) { // Windows: for any process, including this one, // calling unlink() on a locked file will fail $status->merge( $this->closeLockHandles( $path, $handlesToClose ) ); diff --git a/includes/filebackend/lockmanager/LockManager.php b/includes/filebackend/lockmanager/LockManager.php index eff031b58b..e7f37ed981 100644 --- a/includes/filebackend/lockmanager/LockManager.php +++ b/includes/filebackend/lockmanager/LockManager.php @@ -70,7 +70,7 @@ abstract class LockManager { * This only applies if locks are not tied to a connection/process. */ public function __construct( array $config ) { - $this->domain = isset( $config['domain'] ) ? $config['domain'] : wfWikiID(); + $this->domain = isset( $config['domain'] ) ? $config['domain'] : 'global'; if ( isset( $config['lockTTL'] ) ) { $this->lockTTL = max( 5, $config['lockTTL'] ); } elseif ( PHP_SAPI === 'cli' ) { -- 2.20.1