Made LBFactorySimple set "master" flags like LBFactoryMulti
authorAaron Schulz <aschulz@wikimedia.org>
Wed, 30 Sep 2015 23:06:47 +0000 (16:06 -0700)
committerOri.livneh <ori@wikimedia.org>
Thu, 1 Oct 2015 05:11:14 +0000 (05:11 +0000)
* 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
includes/db/loadbalancer/LBFactorySimple.php
tests/phpunit/includes/db/LBFactoryTest.php

index 92fbccd..f0c374f 100644 (file)
@@ -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;
index 23cdbc6..90c33b0 100644 (file)
 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
                ) );
        }
 
index 81d6840..cb2d7db 100644 (file)
@@ -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();
+       }
 }