Remove wf* function dependencies from FSLockManager
authorAaron Schulz <aschulz@wikimedia.org>
Sun, 18 Sep 2016 03:48:23 +0000 (20:48 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Sun, 18 Sep 2016 20:45:56 +0000 (13:45 -0700)
Change-Id: I52f08c6e7372ddbbcc1b5f82d505e435b01ff138

includes/db/DatabaseSqlite.php
includes/filebackend/lockmanager/FSLockManager.php
includes/filebackend/lockmanager/LockManager.php

index 28fb5b5..a52c2ed 100644 (file)
@@ -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"
+               ] );
        }
 
        /**
index 8e149d6..b6629aa 100644 (file)
@@ -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 ) );
index eff031b..e7f37ed 100644 (file)
@@ -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' ) {