summaryrefslogtreecommitdiff
path: root/includes/db/LoadMonitor.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/db/LoadMonitor.php')
-rw-r--r--includes/db/LoadMonitor.php67
1 files changed, 59 insertions, 8 deletions
diff --git a/includes/db/LoadMonitor.php b/includes/db/LoadMonitor.php
index 9b959728..a6370c9e 100644
--- a/includes/db/LoadMonitor.php
+++ b/includes/db/LoadMonitor.php
@@ -14,12 +14,14 @@
interface LoadMonitor {
/**
* Construct a new LoadMonitor with a given LoadBalancer parent
+ *
+ * @param LoadBalancer $parent
*/
function __construct( $parent );
-
+
/**
* Perform pre-connection load ratio adjustment.
- * @param $loads Array
+ * @param $loads array
* @param $group String: the selected query group
* @param $wiki String
*/
@@ -28,13 +30,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.
*
@@ -45,10 +47,30 @@ 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 ) {
+ }
+
+ function getLagTimes( $serverIndexes, $wiki ) {
+ return array_fill_keys( $serverIndexes, 0 );
+ }
+}
+
/**
* Basic MySQL load monitor with no external dependencies
@@ -57,16 +79,38 @@ interface LoadMonitor {
* @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;
@@ -74,7 +118,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 );
@@ -117,12 +161,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;