X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=tests%2Fphpunit%2Fincludes%2Fdb%2FLoadBalancerTest.php;h=85101091a6ea2142680f2eb5e4b4f70622b37b40;hp=defa0aa7658603297d118bfc2be1b32efdd920c3;hb=c05b8b7c473a7dd9c832f91366c45cb8a35c2df2;hpb=117ca62a8c98c4cc829b91a211237230acc117db diff --git a/tests/phpunit/includes/db/LoadBalancerTest.php b/tests/phpunit/includes/db/LoadBalancerTest.php index defa0aa765..85101091a6 100644 --- a/tests/phpunit/includes/db/LoadBalancerTest.php +++ b/tests/phpunit/includes/db/LoadBalancerTest.php @@ -51,8 +51,11 @@ class LoadBalancerTest extends MediaWikiTestCase { } /** - * @covers LoadBalancer::getLocalDomainID() - * @covers LoadBalancer::resolveDomainID() + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection() + * @covers \Wikimedia\Rdbms\LoadBalancer::getLocalDomainID() + * @covers \Wikimedia\Rdbms\LoadBalancer::resolveDomainID() + * @covers \Wikimedia\Rdbms\LoadBalancer::haveIndex() + * @covers \Wikimedia\Rdbms\LoadBalancer::isNonZeroLoad() */ public function testWithoutReplica() { global $wgDBname; @@ -68,6 +71,15 @@ class LoadBalancerTest extends MediaWikiTestCase { } ] ); + $this->assertEquals( 1, $lb->getServerCount() ); + $this->assertFalse( $lb->hasReplicaServers() ); + $this->assertFalse( $lb->hasStreamingReplicaServers() ); + + $this->assertTrue( $lb->haveIndex( 0 ) ); + $this->assertFalse( $lb->haveIndex( 1 ) ); + $this->assertFalse( $lb->isNonZeroLoad( 0 ) ); + $this->assertFalse( $lb->isNonZeroLoad( 1 ) ); + $ld = DatabaseDomain::newFromId( $lb->getLocalDomainID() ); $this->assertEquals( $wgDBname, $ld->getDatabase(), 'local domain DB set' ); $this->assertEquals( $this->dbPrefix(), $ld->getTablePrefix(), 'local domain prefix set' ); @@ -108,6 +120,17 @@ class LoadBalancerTest extends MediaWikiTestCase { $lb->closeAll(); } + /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection() + * @covers \Wikimedia\Rdbms\LoadBalancer::getReaderIndex() + * @covers \Wikimedia\Rdbms\LoadBalancer::getWriterIndex() + * @covers \Wikimedia\Rdbms\LoadBalancer::haveIndex() + * @covers \Wikimedia\Rdbms\LoadBalancer::isNonZeroLoad() + * @covers \Wikimedia\Rdbms\LoadBalancer::getServerName() + * @covers \Wikimedia\Rdbms\LoadBalancer::getServerInfo() + * @covers \Wikimedia\Rdbms\LoadBalancer::getServerType() + * @covers \Wikimedia\Rdbms\LoadBalancer::getServerAttributes() + */ public function testWithReplica() { global $wgDBserver; @@ -118,6 +141,18 @@ class LoadBalancerTest extends MediaWikiTestCase { $this->assertTrue( $lb->hasReplicaServers() ); $this->assertTrue( $lb->hasStreamingReplicaServers() ); + $this->assertTrue( $lb->haveIndex( 0 ) ); + $this->assertTrue( $lb->haveIndex( 1 ) ); + $this->assertFalse( $lb->isNonZeroLoad( 0 ) ); + $this->assertTrue( $lb->isNonZeroLoad( 1 ) ); + + for ( $i = 0; $i < $lb->getServerCount(); ++$i ) { + $this->assertType( 'string', $lb->getServerName( $i ) ); + $this->assertType( 'array', $lb->getServerInfo( $i ) ); + $this->assertType( 'string', $lb->getServerType( $i ) ); + $this->assertType( 'array', $lb->getServerAttributes( $i ) ); + } + $dbw = $lb->getConnection( DB_MASTER ); $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' ); $this->assertEquals( @@ -129,12 +164,14 @@ class LoadBalancerTest extends MediaWikiTestCase { $dbr = $lb->getConnection( DB_REPLICA ); $this->assertTrue( $dbr->getLBInfo( 'replica' ), 'replica shows as replica' ); + $this->assertTrue( $dbr->isReadOnly(), 'replica shows as replica' ); $this->assertEquals( ( $wgDBserver != '' ) ? $wgDBserver : 'localhost', $dbr->getLBInfo( 'clusterMasterHost' ), 'cluster master set' ); $this->assertTrue( $dbr->getFlag( $dbw::DBO_TRX ), "DBO_TRX set on replica" ); $this->assertWriteForbidden( $dbr ); + $this->assertEquals( $dbr->getLBInfo( 'serverIndex' ), $lb->getReaderIndex() ); if ( !$lb->getServerAttributes( $lb->getWriterIndex() )[$dbw::ATTR_DB_LEVEL_LOCKING] ) { $dbwAuto = $lb->getConnection( DB_MASTER, [], false, $lb::CONN_TRX_AUTOCOMMIT ); @@ -167,7 +204,9 @@ class LoadBalancerTest extends MediaWikiTestCase { ] ); } - private function newMultiServerLocalLoadBalancer( $lbExtra = [], $srvExtra = [] ) { + private function newMultiServerLocalLoadBalancer( + $lbExtra = [], $srvExtra = [], $masterOnly = false + ) { global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir; $servers = [ @@ -180,7 +219,7 @@ class LoadBalancerTest extends MediaWikiTestCase { 'password' => $wgDBpassword, 'type' => $wgDBtype, 'dbDirectory' => $wgSQLiteDataDir, - 'load' => 0, + 'load' => $masterOnly ? 100 : 0, ], // Main replica DBs 1 => $srvExtra + [ @@ -191,7 +230,7 @@ class LoadBalancerTest extends MediaWikiTestCase { 'password' => $wgDBpassword, 'type' => $wgDBtype, 'dbDirectory' => $wgSQLiteDataDir, - 'load' => 100, + 'load' => $masterOnly ? 0 : 100, ], 2 => $srvExtra + [ 'host' => $wgDBserver, @@ -201,7 +240,7 @@ class LoadBalancerTest extends MediaWikiTestCase { 'password' => $wgDBpassword, 'type' => $wgDBtype, 'dbDirectory' => $wgSQLiteDataDir, - 'load' => 100, + 'load' => $masterOnly ? 0 : 100, ], // RC replica DBs 3 => $srvExtra + [ @@ -386,8 +425,10 @@ class LoadBalancerTest extends MediaWikiTestCase { } /** - * @covers LoadBalancer::openConnection() - * @covers LoadBalancer::getAnyOpenConnection() + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection() + * @covers \Wikimedia\Rdbms\LoadBalancer::openConnection() + * @covers \Wikimedia\Rdbms\LoadBalancer::getAnyOpenConnection() + * @covers \Wikimedia\Rdbms\LoadBalancer::getWriterIndex() */ function testOpenConnection() { $lb = $this->newSingleServerLocalLoadBalancer(); @@ -433,6 +474,18 @@ class LoadBalancerTest extends MediaWikiTestCase { $lb->closeAll(); } + /** + * @covers \Wikimedia\Rdbms\LoadBalancer::openConnection() + * @covers \Wikimedia\Rdbms\LoadBalancer::getWriterIndex() + * @covers \Wikimedia\Rdbms\LoadBalancer::forEachOpenMasterConnection() + * @covers \Wikimedia\Rdbms\LoadBalancer::setTransactionListener() + * @covers \Wikimedia\Rdbms\LoadBalancer::beginMasterChanges() + * @covers \Wikimedia\Rdbms\LoadBalancer::finalizeMasterChanges() + * @covers \Wikimedia\Rdbms\LoadBalancer::approveMasterChanges() + * @covers \Wikimedia\Rdbms\LoadBalancer::commitMasterChanges() + * @covers \Wikimedia\Rdbms\LoadBalancer::runMasterTransactionIdleCallbacks() + * @covers \Wikimedia\Rdbms\LoadBalancer::runMasterTransactionListenerCallbacks() + */ public function testTransactionCallbackChains() { global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir; @@ -520,6 +573,10 @@ class LoadBalancerTest extends MediaWikiTestCase { $conn2->close(); } + /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnectionRef + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection() + */ public function testDBConnRefReadsMasterAndReplicaRoles() { $lb = $this->newSingleServerLocalLoadBalancer(); @@ -544,6 +601,7 @@ class LoadBalancerTest extends MediaWikiTestCase { } /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnectionRef * @expectedException \Wikimedia\Rdbms\DBReadOnlyRoleError */ public function testDBConnRefWritesReplicaRole() { @@ -555,6 +613,7 @@ class LoadBalancerTest extends MediaWikiTestCase { } /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnectionRef * @expectedException \Wikimedia\Rdbms\DBReadOnlyRoleError */ public function testDBConnRefWritesReplicaRoleIndex() { @@ -566,6 +625,7 @@ class LoadBalancerTest extends MediaWikiTestCase { } /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnectionRef * @expectedException \Wikimedia\Rdbms\DBReadOnlyRoleError */ public function testDBConnRefWritesReplicaRoleInsert() { @@ -576,6 +636,10 @@ class LoadBalancerTest extends MediaWikiTestCase { $rConn->insert( 'test', [ 't' => 1 ], __METHOD__ ); } + /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection() + * @covers \Wikimedia\Rdbms\LoadBalancer::getMaintenanceConnectionRef() + */ public function testQueryGroupIndex() { $lb = $this->newMultiServerLocalLoadBalancer( [ 'defaultGroup' => false ] ); /** @var LoadBalancer $lbWrapper */ @@ -596,9 +660,13 @@ class LoadBalancerTest extends MediaWikiTestCase { $rRC = $lb->getConnectionRef( DB_REPLICA, [ 'recentchanges' ] ); $rWL = $lb->getConnectionRef( DB_REPLICA, [ 'watchlist' ] ); + $rRCMaint = $lb->getMaintenanceConnectionRef( DB_REPLICA, [ 'recentchanges' ] ); + $rWLMaint = $lb->getMaintenanceConnectionRef( DB_REPLICA, [ 'watchlist' ] ); $this->assertEquals( 3, $rRC->getLBInfo( 'serverIndex' ) ); $this->assertEquals( 3, $rWL->getLBInfo( 'serverIndex' ) ); + $this->assertEquals( 3, $rRCMaint->getLBInfo( 'serverIndex' ) ); + $this->assertEquals( 3, $rWLMaint->getLBInfo( 'serverIndex' ) ); $rLog = $lb->getConnectionRef( DB_REPLICA, [ 'logging', 'watchlist' ] ); $logIndexPicked = $rLog->getLBInfo( 'serverIndex' ); @@ -618,4 +686,37 @@ class LoadBalancerTest extends MediaWikiTestCase { $this->assertEquals( $vslowIndexPicked, $lbWrapper->getExistingReaderIndex( 'vslow' ) ); $this->assertEquals( 6, $vslowIndexPicked ); } + + public function testNonZeroMasterLoad() { + $lb = $this->newMultiServerLocalLoadBalancer( [], [ 'flags' => DBO_DEFAULT ], true ); + // Make sure that no infinite loop occurs (T226678) + $rGeneric = $lb->getConnectionRef( DB_REPLICA ); + $this->assertEquals( $lb->getWriterIndex(), $rGeneric->getLBInfo( 'serverIndex' ) ); + } + + /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getLazyConnectionRef + */ + public function testGetLazyConnectionRef() { + $lb = $this->newMultiServerLocalLoadBalancer(); + + $rMaster = $lb->getLazyConnectionRef( DB_MASTER ); + $rReplica = $lb->getLazyConnectionRef( 1 ); + $this->assertFalse( $lb->getAnyOpenConnection( 0 ) ); + $this->assertFalse( $lb->getAnyOpenConnection( 1 ) ); + + $rMaster->getType(); + $rReplica->getType(); + $rMaster->getDomainID(); + $rReplica->getDomainID(); + $this->assertFalse( $lb->getAnyOpenConnection( 0 ) ); + $this->assertFalse( $lb->getAnyOpenConnection( 1 ) ); + + $rMaster->query( "SELECT 1", __METHOD__ ); + $this->assertNotFalse( $lb->getAnyOpenConnection( 0 ) ); + + $rReplica->query( "SELECT 1", __METHOD__ ); + $this->assertNotFalse( $lb->getAnyOpenConnection( 0 ) ); + $this->assertNotFalse( $lb->getAnyOpenConnection( 1 ) ); + } }