Merge "Revert "jquery.byteLimit: Partial rewrite to fix logic errors""
[lhc/web/wiklou.git] / includes / db / LoadMonitor.php
index f8bf3af..146ac61 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Database load monitoring
+ * 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
@@ -18,7 +33,7 @@ interface LoadMonitor {
         * @param LoadBalancer $parent
         */
        function __construct( $parent );
-       
+
        /**
         * Perform pre-connection load ratio adjustment.
         * @param $loads array
@@ -30,13 +45,13 @@ interface LoadMonitor {
        /**
         * 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.
         *
@@ -47,10 +62,34 @@ interface LoadMonitor {
 
        /**
         * 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
@@ -86,6 +125,11 @@ class LoadMonitor_MySQL implements LoadMonitor {
         * @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;
@@ -93,7 +137,7 @@ class LoadMonitor_MySQL implements LoadMonitor {
                global $wgMemc;
                if ( empty( $wgMemc ) )
                        $wgMemc = wfGetMainCache();
-               
+
                $masterName = $this->parent->getServerName( 0 );
                $memcKey = wfMemcKey( 'lag_times', $masterName );
                $times = $wgMemc->get( $memcKey );
@@ -145,8 +189,10 @@ class LoadMonitor_MySQL implements LoadMonitor {
                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;