Merge "reinstating Change Ifb1f6125..."
[lhc/web/wiklou.git] / includes / db / LoadMonitor.php
index 8e16f1a..146ac61 100644 (file)
 <?php
+/**
+ * Database load monitoring.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
 
 /**
  * An interface for database load monitoring
+ *
+ * @ingroup Database
  */
-
 interface LoadMonitor {
        /**
         * Construct a new LoadMonitor with a given LoadBalancer parent
+        *
+        * @param LoadBalancer $parent
         */
        function __construct( $parent );
-       
+
        /**
         * Perform pre-connection load ratio adjustment.
-        * @param array $loads
-        * @param string $group The selected query group
-        * @param string $wiki
+        * @param $loads array
+        * @param $group String: the selected query group
+        * @param $wiki String
         */
        function scaleLoads( &$loads, $group = false, $wiki = false );
 
        /**
         * Perform post-connection backoff.
         *
-        * If the connection is in overload, this should return a backoff factor 
-        * which will be used to control polling time. The number of threads 
+        * If the connection is in overload, this should return a backoff factor
+        * which will be used to control polling time. The number of threads
         * connected is a good measure.
         *
         * If there is no overload, zero can be returned.
         *
-        * A threshold thread count is given, the concrete class may compare this 
+        * A threshold thread count is given, the concrete class may compare this
         * to the running thread count. The threshold may be false, which indicates
         * that the sysadmin has not configured this feature.
         *
-        * @param Database $conn
-        * @param float $threshold
+        * @param $conn DatabaseBase
+        * @param $threshold Float
         */
        function postConnectionBackoff( $conn, $threshold );
 
        /**
         * Return an estimate of replication lag for each server
+        *
+        * @param $serverIndexes
+        * @param $wiki
+        *
+        * @return array
         */
        function getLagTimes( $serverIndexes, $wiki );
 }
 
+class LoadMonitor_Null implements LoadMonitor {
+       function __construct( $parent ) {
+       }
+
+       function scaleLoads( &$loads, $group = false, $wiki = false ) {
+       }
+
+       function postConnectionBackoff( $conn, $threshold ) {
+       }
+
+       /**
+        * @param $serverIndexes
+        * @param $wiki
+        * @return array
+        */
+       function getLagTimes( $serverIndexes, $wiki ) {
+               return array_fill_keys( $serverIndexes, 0 );
+       }
+}
 
 /**
  * Basic MySQL load monitor with no external dependencies
  * Uses memcached to cache the replication lag for a short time
+ *
+ * @ingroup Database
  */
-
 class LoadMonitor_MySQL implements LoadMonitor {
-       var $parent; // LoadBalancer
 
+       /**
+        * @var LoadBalancer
+        */
+       var $parent;
+
+       /**
+        * @param LoadBalancer $parent
+        */
        function __construct( $parent ) {
                $this->parent = $parent;
        }
 
+       /**
+        * @param $loads
+        * @param $group bool
+        * @param $wiki bool
+        */
        function scaleLoads( &$loads, $group = false, $wiki = false ) {
        }
 
+       /**
+        * @param $serverIndexes
+        * @param $wiki
+        * @return array
+        */
        function getLagTimes( $serverIndexes, $wiki ) {
+               if ( count( $serverIndexes ) == 1 && reset( $serverIndexes ) == 0 ) {
+                       // Single server only, just return zero without caching
+                       return array( 0 => 0 );
+               }
+
                wfProfileIn( __METHOD__ );
                $expiry = 5;
                $requestRate = 10;
 
                global $wgMemc;
+               if ( empty( $wgMemc ) )
+                       $wgMemc = wfGetMainCache();
+
                $masterName = $this->parent->getServerName( 0 );
                $memcKey = wfMemcKey( 'lag_times', $masterName );
                $times = $wgMemc->get( $memcKey );
@@ -106,12 +180,19 @@ class LoadMonitor_MySQL implements LoadMonitor {
                return $lagTimes;
        }
 
+       /**
+        * @param $conn DatabaseBase
+        * @param $threshold
+        * @return int
+        */
        function postConnectionBackoff( $conn, $threshold ) {
                if ( !$threshold ) {
                        return 0;
                }
-               $status = $conn->getStatus("Thread%");
+               $status = $conn->getMysqlStatus("Thread%");
                if ( $status['Threads_running'] > $threshold ) {
+                       $server = $conn->getProperty( 'mServer' );
+                       wfLogDBError( "LB backoff from $server - Threads_running = {$status['Threads_running']}\n" );
                        return $status['Threads_connected'];
                } else {
                        return 0;