*
* masterTemplateOverrides An override array for all master servers.
*
+ * loadMonitorClass Name of the LoadMonitor class to always use.
+ *
* readOnlyBySection A map of section name to read-only message.
* Missing or false for read/write.
*
/** @var LoadBalancer[] */
private $extLBs = array();
+ /** @var string */
+ private $loadMonitorClass;
+
/** @var string */
private $lastWiki;
$optional = array( 'groupLoadsBySection', 'groupLoadsByDB', 'hostsByName',
'externalLoads', 'externalTemplateOverrides', 'templateOverridesByServer',
'templateOverridesByCluster', 'masterTemplateOverrides',
- 'readOnlyBySection' );
+ 'readOnlyBySection', 'loadMonitorClass' );
foreach ( $required as $key ) {
if ( !isset( $conf[$key] ) ) {
$servers = $this->makeServerArray( $template, $loads, $groupLoads );
$lb = new LoadBalancer( array(
'servers' => $servers,
+ 'loadMonitor' => $this->loadMonitorClass
) );
return $lb;
$serverInfo = $this->masterTemplateOverrides + $serverInfo;
}
$master = false;
+ } else {
+ $serverInfo['slave'] = true;
}
if ( isset( $this->templateOverridesByServer[$serverName] ) ) {
$serverInfo = $this->templateOverridesByServer[$serverName] + $serverInfo;
class LBFactorySimple extends LBFactory {
/** @var LoadBalancer */
private $mainLB;
-
/** @var LoadBalancer[] */
private $extLBs = array();
-
/** @var ChronologyProtector */
private $chronProt;
+ /** @var string */
+ private $loadMonitorClass;
+
public function __construct( array $conf ) {
$this->chronProt = new ChronologyProtector;
+ $this->loadMonitorClass = isset( $conf['loadMonitorClass'] )
+ ? $conf['loadMonitorClass']
+ : null;
}
/**
*/
public function newMainLB( $wiki = false ) {
global $wgDBservers;
- if ( $wgDBservers ) {
+
+ if ( is_array( $wgDBservers ) ) {
$servers = $wgDBservers;
+ foreach ( $servers as $i => &$server ) {
+ if ( $i == 0 ) {
+ $server['master'] = true;
+ } else {
+ $server['slave'] = true;
+ }
+ }
} else {
global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype, $wgDebugDumpSql;
global $wgDBssl, $wgDBcompress;
'dbname' => $wgDBname,
'type' => $wgDBtype,
'load' => 1,
- 'flags' => $flags
+ 'flags' => $flags,
+ 'master' => true
) );
}
return new LoadBalancer( array(
'servers' => $servers,
+ 'loadMonitor' => $this->loadMonitorClass
) );
}
}
return new LoadBalancer( array(
- 'servers' => $wgExternalServers[$cluster]
+ 'servers' => $wgExternalServers[$cluster],
+ 'loadMonitor' => $this->loadMonitorClass
) );
}
array( 'LBFactoryFake', 'LBFactory_Fake' ),
);
}
+
+ public function testLBFactorySimpleServer() {
+ $this->setMwGlobals( 'wgDBservers', false );
+
+ $factory = new LBFactorySimple( array() );
+ $lb = $factory->getMainLB();
+
+ $dbw = $lb->getConnection( DB_MASTER );
+ $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
+
+ $dbr = $lb->getConnection( DB_SLAVE );
+ $this->assertTrue( $dbr->getLBInfo( 'master' ), 'DB_SLAVE also gets the master' );
+
+ $factory->shutdown();
+ $lb->closeAll();
+ }
+
+ public function testLBFactorySimpleServers() {
+ global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+
+ $this->setMwGlobals( 'wgDBservers', array(
+ array( // master
+ 'host' => $wgDBserver,
+ 'dbname' => $wgDBname,
+ 'user' => $wgDBuser,
+ 'password' => $wgDBpassword,
+ 'type' => $wgDBtype,
+ 'load' => 0,
+ 'flags' => DBO_TRX // REPEATABLE-READ for consistency
+ ),
+ array( // emulated slave
+ 'host' => $wgDBserver,
+ 'dbname' => $wgDBname,
+ 'user' => $wgDBuser,
+ 'password' => $wgDBpassword,
+ 'type' => $wgDBtype,
+ 'load' => 100,
+ 'flags' => DBO_TRX // REPEATABLE-READ for consistency
+ )
+ ) );
+
+ $factory = new LBFactorySimple( array( 'loadMonitorClass' => 'LoadMonitorNull' ) );
+ $lb = $factory->getMainLB();
+
+ $dbw = $lb->getConnection( DB_MASTER );
+ $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
+
+ $dbr = $lb->getConnection( DB_SLAVE );
+ $this->assertTrue( $dbr->getLBInfo( 'slave' ), 'slave shows as slave' );
+
+ $factory->shutdown();
+ $lb->closeAll();
+ }
+
+ public function testLBFactoryMulti() {
+ global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+
+ $factory = new LBFactoryMulti( array(
+ 'sectionsByDB' => array(),
+ 'sectionLoads' => array(
+ 'DEFAULT' => array(
+ 'test-db1' => 0,
+ 'test-db2' => 100,
+ ),
+ ),
+ 'serverTemplate' => array(
+ 'dbname' => $wgDBname,
+ 'user' => $wgDBuser,
+ 'password' => $wgDBpassword,
+ 'type' => $wgDBtype,
+ 'flags' => DBO_DEFAULT
+ ),
+ 'hostsByName' => array(
+ 'test-db1' => $wgDBserver,
+ 'test-db2' => $wgDBserver
+ ),
+ 'loadMonitorClass' => 'LoadMonitorNull'
+ ) );
+ $lb = $factory->getMainLB();
+
+ $dbw = $lb->getConnection( DB_MASTER );
+ $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
+
+ $dbr = $lb->getConnection( DB_SLAVE );
+ $this->assertTrue( $dbr->getLBInfo( 'slave' ), 'slave shows as slave' );
+
+ $factory->shutdown();
+ $lb->closeAll();
+ }
}