Cleanups to DatabaseMysqlBase

* Avoid global methods
* Inject global variables
* Remove $wgAllDBsAreLocalhost hack

Change-Id: I54b23654def1f83518764ad697434aebfc6cef73
This commit is contained in:
Aaron Schulz 2016-09-15 20:33:25 -07:00
parent a8f1b3ebe5
commit 5bc9b990ac
7 changed files with 36 additions and 34 deletions

View file

@ -317,7 +317,7 @@ $wgAutoloadLocalClasses = [
'DBUnexpectedError' => __DIR__ . '/includes/libs/rdbms/exception/DBError.php',
'DataUpdate' => __DIR__ . '/includes/deferred/DataUpdate.php',
'Database' => __DIR__ . '/includes/libs/rdbms/database/Database.php',
'DatabaseBase' => __DIR__ . '/includes/db/Database.php',
'DatabaseBase' => __DIR__ . '/includes/libs/rdbms/database/DatabaseBase.php',
'DatabaseInstaller' => __DIR__ . '/includes/installer/DatabaseInstaller.php',
'DatabaseLag' => __DIR__ . '/maintenance/lag.php',
'DatabaseLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',

View file

@ -1835,13 +1835,6 @@ $wgDBmwschema = null;
*/
$wgSQLiteDataDir = '';
/**
* Make all database connections secretly go to localhost. Fool the load balancer
* thinking there is an arbitrarily large cluster of servers to connect to.
* Useful for debugging.
*/
$wgAllDBsAreLocalhost = false;
/**
* Shared database for multiple wikis. Commonly used for storing a user table
* for single sign-on. The server for this database must be the same as for the

View file

@ -46,6 +46,11 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
protected $sslCAPath;
/** @var string[]|null */
protected $sslCiphers;
/** @var string sql_mode value to send on connection */
protected $sqlMode;
/** @var bool Use experimental UTF-8 transmission encoding */
protected $utf8Mode;
/** @var string|null */
private $serverVersion = null;
@ -82,6 +87,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
$this->$var = $params[$var];
}
}
$this->sqlMode = isset( $params['sqlMode'] ) ? $params['sqlMode'] : '';
$this->utf8Mode = !empty( $params['utf8Mode'] );
}
/**
@ -100,13 +107,9 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
* @return bool
*/
function open( $server, $user, $password, $dbName ) {
global $wgAllDBsAreLocalhost, $wgSQLMode;
# Close/unset connection handle
$this->close();
# Debugging hack -- fake cluster
$realServer = $wgAllDBsAreLocalhost ? 'localhost' : $server;
$this->mServer = $server;
$this->mUser = $user;
$this->mPassword = $password;
@ -114,7 +117,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
$this->installErrorHandler();
try {
$this->mConn = $this->mysqlConnect( $realServer );
$this->mConn = $this->mysqlConnect( $this->mServer );
} catch ( Exception $ex ) {
$this->restoreErrorHandler();
throw $ex;
@ -126,14 +129,14 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
if ( !$error ) {
$error = $this->lastError();
}
wfLogDBError(
$this->queryLogger->error(
"Error connecting to {db_server}: {error}",
$this->getLogContext( [
'method' => __METHOD__,
'error' => $error,
] )
);
wfDebug( "DB connection error\n" .
$this->queryLogger->debug( "DB connection error\n" .
"Server: $server, User: $user, Password: " .
substr( $password, 0, 3 ) . "..., error: " . $error . "\n" );
@ -145,14 +148,14 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
$success = $this->selectDB( $dbName );
MediaWiki\restoreWarnings();
if ( !$success ) {
wfLogDBError(
$this->queryLogger->error(
"Error selecting database {db_name} on server {db_server}",
$this->getLogContext( [
'method' => __METHOD__,
] )
);
wfDebug( "Error selecting database $dbName on server {$this->mServer} " .
"from client host " . wfHostname() . "\n" );
$this->queryLogger->debug(
"Error selecting database $dbName on server {$this->mServer}" );
$this->reportConnectionError( "Error selecting database $dbName" );
}
@ -166,8 +169,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
// Abstract over any insane MySQL defaults
$set = [ 'group_concat_max_len = 262144' ];
// Set SQL mode, default is turning them all off, can be overridden or skipped with null
if ( is_string( $wgSQLMode ) ) {
$set[] = 'sql_mode = ' . $this->addQuotes( $wgSQLMode );
if ( is_string( $this->sqlMode ) ) {
$set[] = 'sql_mode = ' . $this->addQuotes( $this->sqlMode );
}
// Set any custom settings defined by site config
// (e.g. https://dev.mysql.com/doc/refman/4.1/en/innodb-parameters.html)
@ -183,7 +186,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
// Use doQuery() to avoid opening implicit transactions (DBO_TRX)
$success = $this->doQuery( 'SET ' . implode( ', ', $set ) );
if ( !$success ) {
wfLogDBError(
$this->queryLogger->error(
'Error setting MySQL variables on server {db_server} (check $wgSQLMode)',
$this->getLogContext( [
'method' => __METHOD__,
@ -204,9 +207,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
* @return bool
*/
protected function connectInitCharset() {
global $wgDBmysql5;
if ( $wgDBmysql5 ) {
if ( $this->utf8Mode ) {
// Tell the server we're communicating with it in UTF-8.
// This may engage various charset conversions.
return $this->mysqlSetCharset( 'utf8' );
@ -657,7 +658,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
// Standard method: use master server ID (works with stock pt-heartbeat)
$masterInfo = $this->getMasterServerInfo();
if ( !$masterInfo ) {
wfLogDBError(
$this->queryLogger->error(
"Unable to query master of {db_server} for server ID",
$this->getLogContext( [
'method' => __METHOD__
@ -680,7 +681,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
return max( $nowUnix - $timeUnix, 0.0 );
}
wfLogDBError(
$this->queryLogger->error(
"Unable to find pt-heartbeat row for {db_server}",
$this->getLogContext( [
'method' => __METHOD__
@ -984,7 +985,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
return true;
}
wfDebug( __METHOD__ . " failed to acquire lock\n" );
$this->queryLogger->debug( __METHOD__ . " failed to acquire lock\n" );
return false;
}
@ -1006,7 +1007,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
return true;
}
wfDebug( __METHOD__ . " failed to release lock\n" );
$this->queryLogger->debug( __METHOD__ . " failed to release lock\n" );
return false;
}

View file

@ -37,7 +37,7 @@ abstract class LBFactoryMW extends LBFactory implements DestructibleService {
* @TODO: inject objects via dependency framework
*/
public function __construct( array $conf ) {
global $wgCommandLineMode;
global $wgCommandLineMode, $wgSQLMode, $wgDBmysql5;
$defaults = [
'localDomain' => wfWikiID(),
@ -66,6 +66,11 @@ abstract class LBFactoryMW extends LBFactory implements DestructibleService {
$this->agent = isset( $params['agent'] ) ? $params['agent'] : '';
$this->cliMode = isset( $params['cliMode'] ) ? $params['cliMode'] : $wgCommandLineMode;
if ( isset( $conf['serverTemplate'] ) ) { // LBFactoryMulti
$conf['serverTemplate']['sqlMode'] = $wgSQLMode;
$conf['serverTemplate']['utf8Mode'] = $wgDBmysql5;
}
parent::__construct( $conf + $defaults );
}

View file

@ -46,7 +46,7 @@ class LBFactorySimple extends LBFactoryMW {
* @return LoadBalancer
*/
public function newMainLB( $wiki = false ) {
global $wgDBservers, $wgDBprefix, $wgDBmwschema;
global $wgDBservers, $wgDBprefix, $wgDBmwschema, $wgSQLMode, $wgDBmysql5;
if ( is_array( $wgDBservers ) ) {
$servers = $wgDBservers;
@ -59,7 +59,9 @@ class LBFactorySimple extends LBFactoryMW {
$server += [
'schema' => $wgDBmwschema,
'tablePrefix' => $wgDBprefix,
'flags' => DBO_DEFAULT
'flags' => DBO_DEFAULT,
'sqlMode' => $wgSQLMode,
'utf8Mode' => $wgDBmysql5
];
}
} else {
@ -87,7 +89,9 @@ class LBFactorySimple extends LBFactoryMW {
'type' => $wgDBtype,
'load' => 1,
'flags' => $flags,
'master' => true
'master' => true,
'sqlMode' => $wgSQLMode,
'utf8Mode' => $wgDBmysql5
] ];
}

View file

@ -445,8 +445,7 @@ abstract class LBFactory {
$failed = [];
foreach ( $lbs as $i => $lb ) {
if ( $masterPositions[$i] ) {
// The DBMS may not support getMasterPos() or the whole
// load balancer might be fake (e.g. $wgAllDBsAreLocalhost).
// The DBMS may not support getMasterPos()
if ( !$lb->waitForAll( $masterPositions[$i], $opts['timeout'] ) ) {
$failed[] = $lb->getServerName( $lb->getWriterIndex() );
}