When LoadBalancer opens new local domain connections, it currently assumes that the domain specified by the server info array is the same. For sanity, make sure that the handle is set to the local domain. The main LBFactory/LoadBalancer use $wgDBname/$wgDBprefix as the local domain, corresponding with wfWikiId(). This relation is set automatically in MWLBFactory. If $wgLBFactoryConf/$wgDBservers is manually configured in a way breaking this correspondance, then it is misconfigured. Fixes made to avoid test failure: * Make sure LoadBalancer::setDomainPrefix() updates the local domain alias member. Also do not bother changing the domain of foreign connections. * Use the right domain ID for the connection array key names in LoadBalancer::openForeignConnection(). * Now that JobQueueTest no longer mistakenly uses the non-test tables, force it to use the main DB_MASTER handle so that it can see the unit test tables even if they are TEMPORARY; such tables are tied to the TCP connection, so separate handles see different temporary tables. Change-Id: I56f8b32fe957f984b8c9753e6db3b20abe96b038
80 lines
2.5 KiB
PHP
80 lines
2.5 KiB
PHP
<?php
|
|
/**
|
|
* Simple generator of database connections that always returns the same object.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
* @file
|
|
* @ingroup Database
|
|
*/
|
|
|
|
namespace Wikimedia\Rdbms;
|
|
|
|
use InvalidArgumentException;
|
|
|
|
/**
|
|
* Trivial LoadBalancer that always returns an injected connection handle
|
|
*/
|
|
class LoadBalancerSingle extends LoadBalancer {
|
|
/** @var IDatabase */
|
|
private $db;
|
|
|
|
/**
|
|
* @param array $params An associative array with one member:
|
|
* - connection: An IDatabase connection object
|
|
*/
|
|
public function __construct( array $params ) {
|
|
if ( !isset( $params['connection'] ) ) {
|
|
throw new InvalidArgumentException( "Missing 'connection' argument." );
|
|
}
|
|
|
|
$this->db = $params['connection'];
|
|
|
|
parent::__construct( [
|
|
'servers' => [
|
|
[
|
|
'type' => $this->db->getType(),
|
|
'host' => $this->db->getServer(),
|
|
'dbname' => $this->db->getDBname(),
|
|
'load' => 1,
|
|
]
|
|
],
|
|
'trxProfiler' => isset( $params['trxProfiler'] ) ? $params['trxProfiler'] : null,
|
|
'srvCache' => isset( $params['srvCache'] ) ? $params['srvCache'] : null,
|
|
'wanCache' => isset( $params['wanCache'] ) ? $params['wanCache'] : null
|
|
] );
|
|
|
|
if ( isset( $params['readOnlyReason'] ) ) {
|
|
$this->db->setLBInfo( 'readOnlyReason', $params['readOnlyReason'] );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param IDatabase $db Live connection handle
|
|
* @param array $params Parameter map to LoadBalancerSingle::__constructs()
|
|
* @return LoadBalancerSingle
|
|
* @since 1.28
|
|
*/
|
|
public static function newFromConnection( IDatabase $db, array $params = [] ) {
|
|
return new static( [ 'connection' => $db ] + $params );
|
|
}
|
|
|
|
protected function reallyOpenConnection( array $server, $dbNameOverride ) {
|
|
return $this->db;
|
|
}
|
|
}
|
|
|
|
class_alias( 'Wikimedia\Rdbms\LoadBalancerSingle', 'LoadBalancerSingle' );
|