From ba00bd342bb34ba559c094f9a06c86f3daea2891 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Wed, 30 Sep 2015 16:06:47 -0700 Subject: [PATCH] Made LBFactorySimple set "master" flags like LBFactoryMulti * wfGetDB( DB_MASTER )->getLBInfo() now shows the master flag * A corresponding slave flag was also added * Added a few badly needed LBFactory/LoadBalancer tests Change-Id: I9254b12cff63af7d754a3a14c5db44276f58d280 --- includes/db/loadbalancer/LBFactoryMulti.php | 10 ++- includes/db/loadbalancer/LBFactorySimple.php | 25 ++++-- tests/phpunit/includes/db/LBFactoryTest.php | 89 ++++++++++++++++++++ 3 files changed, 118 insertions(+), 6 deletions(-) diff --git a/includes/db/loadbalancer/LBFactoryMulti.php b/includes/db/loadbalancer/LBFactoryMulti.php index 92fbccd690..f0c374fbee 100644 --- a/includes/db/loadbalancer/LBFactoryMulti.php +++ b/includes/db/loadbalancer/LBFactoryMulti.php @@ -68,6 +68,8 @@ * * 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. * @@ -142,6 +144,9 @@ class LBFactoryMulti extends LBFactory { /** @var LoadBalancer[] */ private $extLBs = array(); + /** @var string */ + private $loadMonitorClass; + /** @var string */ private $lastWiki; @@ -159,7 +164,7 @@ class LBFactoryMulti extends LBFactory { $optional = array( 'groupLoadsBySection', 'groupLoadsByDB', 'hostsByName', 'externalLoads', 'externalTemplateOverrides', 'templateOverridesByServer', 'templateOverridesByCluster', 'masterTemplateOverrides', - 'readOnlyBySection' ); + 'readOnlyBySection', 'loadMonitorClass' ); foreach ( $required as $key ) { if ( !isset( $conf[$key] ) ) { @@ -289,6 +294,7 @@ class LBFactoryMulti extends LBFactory { $servers = $this->makeServerArray( $template, $loads, $groupLoads ); $lb = new LoadBalancer( array( 'servers' => $servers, + 'loadMonitor' => $this->loadMonitorClass ) ); return $lb; @@ -319,6 +325,8 @@ class LBFactoryMulti extends LBFactory { $serverInfo = $this->masterTemplateOverrides + $serverInfo; } $master = false; + } else { + $serverInfo['slave'] = true; } if ( isset( $this->templateOverridesByServer[$serverName] ) ) { $serverInfo = $this->templateOverridesByServer[$serverName] + $serverInfo; diff --git a/includes/db/loadbalancer/LBFactorySimple.php b/includes/db/loadbalancer/LBFactorySimple.php index 23cdbc6350..90c33b0c08 100644 --- a/includes/db/loadbalancer/LBFactorySimple.php +++ b/includes/db/loadbalancer/LBFactorySimple.php @@ -27,15 +27,19 @@ 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; } /** @@ -44,8 +48,16 @@ class LBFactorySimple extends LBFactory { */ 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; @@ -68,12 +80,14 @@ class LBFactorySimple extends LBFactory { 'dbname' => $wgDBname, 'type' => $wgDBtype, 'load' => 1, - 'flags' => $flags + 'flags' => $flags, + 'master' => true ) ); } return new LoadBalancer( array( 'servers' => $servers, + 'loadMonitor' => $this->loadMonitorClass ) ); } @@ -104,7 +118,8 @@ class LBFactorySimple extends LBFactory { } return new LoadBalancer( array( - 'servers' => $wgExternalServers[$cluster] + 'servers' => $wgExternalServers[$cluster], + 'loadMonitor' => $this->loadMonitorClass ) ); } diff --git a/tests/phpunit/includes/db/LBFactoryTest.php b/tests/phpunit/includes/db/LBFactoryTest.php index 81d6840b2b..cb2d7db06c 100644 --- a/tests/phpunit/includes/db/LBFactoryTest.php +++ b/tests/phpunit/includes/db/LBFactoryTest.php @@ -57,4 +57,93 @@ class LBFactoryTest extends MediaWikiTestCase { 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(); + } } -- 2.20.1