Merge "Add ChronologyProtector to ExternalLBs"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 11 Apr 2013 22:40:37 +0000 (22:40 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 11 Apr 2013 22:40:37 +0000 (22:40 +0000)
1  2 
includes/db/LBFactory.php

@@@ -134,8 -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
@@@ -257,6 -256,7 +257,7 @@@ class LBFactory_Simple extends LBFactor
                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];
        }
                if ( $this->mainLB ) {
                        $this->chronProt->shutdownLB( $this->mainLB );
                }
+               foreach ( $this->extLBs as $extLB ) {
+                       $this->chronProt->shutdownLB( $extLB );
+               }
                $this->chronProt->shutdown();
                $this->commitMasterChanges();
        }
   * LBFactory::enableBackend() to return to normal behavior
   */
  class LBFactory_Fake extends LBFactory {
 -      function __construct( $conf ) {}
 +      function __construct( $conf ) {
 +      }
  
        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() ) {
 +      }
  }
  
  /**
@@@ -324,3 -321,76 +328,3 @@@ class DBAccessError extends MWExceptio
                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;
 -              }
 -      }
 -}