diff options
Diffstat (limited to 'includes/db/LBFactory.php')
-rw-r--r-- | includes/db/LBFactory.php | 94 |
1 files changed, 16 insertions, 78 deletions
diff --git a/includes/db/LBFactory.php b/includes/db/LBFactory.php index d469e867..16c43a00 100644 --- a/includes/db/LBFactory.php +++ b/includes/db/LBFactory.php @@ -134,7 +134,8 @@ abstract class LBFactory { * Prepare all tracked load balancers for shutdown * STUB */ - function shutdown() {} + function shutdown() { + } /** * Call a method of each tracked load balancer @@ -201,7 +202,7 @@ class LBFactory_Simple extends LBFactory { $flags |= DBO_COMPRESS; } - $servers = array(array( + $servers = array( array( 'host' => $wgDBserver, 'user' => $wgDBuser, 'password' => $wgDBpassword, @@ -256,6 +257,7 @@ class LBFactory_Simple extends LBFactory { if ( !isset( $this->extLBs[$cluster] ) ) { $this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki ); $this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) ); + $this->chronProt->initLB( $this->extLBs[$cluster] ); } return $this->extLBs[$cluster]; } @@ -280,6 +282,9 @@ class LBFactory_Simple extends LBFactory { if ( $this->mainLB ) { $this->chronProt->shutdownLB( $this->mainLB ); } + foreach ( $this->extLBs as $extLB ) { + $this->chronProt->shutdownLB( $extLB ); + } $this->chronProt->shutdown(); $this->commitMasterChanges(); } @@ -292,21 +297,27 @@ class LBFactory_Simple extends LBFactory { * LBFactory::enableBackend() to return to normal behavior */ class LBFactory_Fake extends LBFactory { - function __construct( $conf ) {} + function __construct( $conf ) { + } - function newMainLB( $wiki = false) { + function newMainLB( $wiki = false ) { throw new DBAccessError; } + function getMainLB( $wiki = false ) { throw new DBAccessError; } + function newExternalLB( $cluster, $wiki = false ) { throw new DBAccessError; } + function &getExternalLB( $cluster, $wiki = false ) { throw new DBAccessError; } - function forEachLB( $callback, $params = array() ) {} + + function forEachLB( $callback, $params = array() ) { + } } /** @@ -317,76 +328,3 @@ class DBAccessError extends MWException { parent::__construct( "Mediawiki tried to access the database via wfGetDB(). This is not allowed." ); } } - -/** - * Class for ensuring a consistent ordering of events as seen by the user, despite replication. - * Kind of like Hawking's [[Chronology Protection Agency]]. - */ -class ChronologyProtector { - var $startupPos; - var $shutdownPos = array(); - - /** - * Initialise a LoadBalancer to give it appropriate chronology protection. - * - * @param $lb LoadBalancer - */ - function initLB( $lb ) { - if ( $this->startupPos === null ) { - if ( !empty( $_SESSION[__CLASS__] ) ) { - $this->startupPos = $_SESSION[__CLASS__]; - } - } - if ( !$this->startupPos ) { - return; - } - $masterName = $lb->getServerName( 0 ); - - if ( $lb->getServerCount() > 1 && !empty( $this->startupPos[$masterName] ) ) { - $info = $lb->parentInfo(); - $pos = $this->startupPos[$masterName]; - wfDebug( __METHOD__ . ": LB " . $info['id'] . " waiting for master pos $pos\n" ); - $lb->waitFor( $this->startupPos[$masterName] ); - } - } - - /** - * Notify the ChronologyProtector that the LoadBalancer is about to shut - * down. Saves replication positions. - * - * @param $lb LoadBalancer - */ - function shutdownLB( $lb ) { - // Don't start a session, don't bother with non-replicated setups - if ( strval( session_id() ) == '' || $lb->getServerCount() <= 1 ) { - return; - } - $masterName = $lb->getServerName( 0 ); - if ( isset( $this->shutdownPos[$masterName] ) ) { - // Already done - return; - } - // Only save the position if writes have been done on the connection - $db = $lb->getAnyOpenConnection( 0 ); - $info = $lb->parentInfo(); - if ( !$db || !$db->doneWrites() ) { - wfDebug( __METHOD__ . ": LB {$info['id']}, no writes done\n" ); - return; - } - $pos = $db->getMasterPos(); - wfDebug( __METHOD__ . ": LB {$info['id']} has master pos $pos\n" ); - $this->shutdownPos[$masterName] = $pos; - } - - /** - * Notify the ChronologyProtector that the LBFactory is done calling shutdownLB() for now. - * May commit chronology data to persistent storage. - */ - function shutdown() { - if ( session_id() != '' && count( $this->shutdownPos ) ) { - wfDebug( __METHOD__ . ": saving master pos for " . - count( $this->shutdownPos ) . " master(s)\n" ); - $_SESSION[__CLASS__] = $this->shutdownPos; - } - } -} |