X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=tests%2Fphpunit%2Fincludes%2Fdb%2FLoadBalancerTest.php;h=bf5326a4407ef62484c6c05a51c2140e406c6f48;hp=0c0b82b5959bbbd6a5ecd98779183e3a4b647ba4;hb=bd5a37aacf600bdd5f3a6e7998f92bd1d9326a8a;hpb=e0d2eabecf022886ad3ffc67de99cf13d236c8eb diff --git a/tests/phpunit/includes/db/LoadBalancerTest.php b/tests/phpunit/includes/db/LoadBalancerTest.php index 0c0b82b595..bf5326a440 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 ); @@ -388,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(); @@ -435,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; @@ -522,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(); @@ -546,6 +601,7 @@ class LoadBalancerTest extends MediaWikiTestCase { } /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnectionRef * @expectedException \Wikimedia\Rdbms\DBReadOnlyRoleError */ public function testDBConnRefWritesReplicaRole() { @@ -557,6 +613,7 @@ class LoadBalancerTest extends MediaWikiTestCase { } /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnectionRef * @expectedException \Wikimedia\Rdbms\DBReadOnlyRoleError */ public function testDBConnRefWritesReplicaRoleIndex() { @@ -568,6 +625,7 @@ class LoadBalancerTest extends MediaWikiTestCase { } /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnectionRef * @expectedException \Wikimedia\Rdbms\DBReadOnlyRoleError */ public function testDBConnRefWritesReplicaRoleInsert() { @@ -578,6 +636,35 @@ class LoadBalancerTest extends MediaWikiTestCase { $rConn->insert( 'test', [ 't' => 1 ], __METHOD__ ); } + /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection() + */ + public function testGetConnectionRefDefaultGroup() { + $lb = $this->newMultiServerLocalLoadBalancer( [ 'defaultGroup' => 'vslow' ] ); + $lbWrapper = TestingAccessWrapper::newFromObject( $lb ); + + $rVslow = $lb->getConnectionRef( DB_REPLICA ); + $vslowIndexPicked = $rVslow->getLBInfo( 'serverIndex' ); + + $this->assertSame( $vslowIndexPicked, $lbWrapper->getExistingReaderIndex( 'vslow' ) ); + } + + /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection() + */ + public function testGetConnectionRefUnknownDefaultGroup() { + $lb = $this->newMultiServerLocalLoadBalancer( [ 'defaultGroup' => 'invalid' ] ); + + $this->assertInstanceOf( + IDatabase::class, + $lb->getConnectionRef( DB_REPLICA ) + ); + } + + /** + * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection() + * @covers \Wikimedia\Rdbms\LoadBalancer::getMaintenanceConnectionRef() + */ public function testQueryGroupIndex() { $lb = $this->newMultiServerLocalLoadBalancer( [ 'defaultGroup' => false ] ); /** @var LoadBalancer $lbWrapper */ @@ -586,7 +673,10 @@ class LoadBalancerTest extends MediaWikiTestCase { $rGeneric = $lb->getConnectionRef( DB_REPLICA ); $mainIndexPicked = $rGeneric->getLBInfo( 'serverIndex' ); - $this->assertEquals( $mainIndexPicked, $lbWrapper->getExistingReaderIndex( false ) ); + $this->assertEquals( + $mainIndexPicked, + $lbWrapper->getExistingReaderIndex( $lb::GROUP_GENERIC ) + ); $this->assertTrue( in_array( $mainIndexPicked, [ 1, 2 ] ) ); for ( $i = 0; $i < 300; ++$i ) { $rLog = $lb->getConnectionRef( DB_REPLICA, [] ); @@ -598,9 +688,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' ); @@ -627,4 +721,30 @@ class LoadBalancerTest extends MediaWikiTestCase { $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 ) ); + } }