Aaron Schulz has uploaded a new change for review.
https://gerrit.wikimedia.org/r/155587
Change subject: Avoid sleeper connections in LoadMonitor::getLagTimes()
......................................................................
Avoid sleeper connections in LoadMonitor::getLagTimes()
* Also improved the cache fallback logic
Change-Id: I65a2c46b49a2d79e014b910a7f7357aa64964690
---
M includes/db/LoadMonitor.php
1 file changed, 20 insertions(+), 10 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core
refs/changes/87/155587/1
diff --git a/includes/db/LoadMonitor.php b/includes/db/LoadMonitor.php
index fa2dd99..826eb49 100644
--- a/includes/db/LoadMonitor.php
+++ b/includes/db/LoadMonitor.php
@@ -74,9 +74,18 @@
class LoadMonitorMySQL implements LoadMonitor {
/** @var LoadBalancer */
public $parent;
+ /** @var BagOStuff */
+ protected $cache;
public function __construct( $parent ) {
+ global $wgMemc;
+
$this->parent = $parent;
+ $this->cache = $wgMemc ?: wfGetMainCache();
+ if ( $this->cache instanceof EmptyBagOStuff ) {
+ // At least avoid some needless reconnections
+ $this->cache = ObjectCache::newAccelerator( array(),
'hash' );
+ }
}
public function scaleLoads( &$loads, $group = false, $wiki = false ) {
@@ -93,14 +102,10 @@
$expiry = 5;
$requestRate = 10;
- global $wgMemc;
- if ( empty( $wgMemc ) ) {
- $wgMemc = wfGetMainCache();
- }
-
+ $cache = $this->cache;
$masterName = $this->parent->getServerName( 0 );
$memcKey = wfMemcKey( 'lag_times', $masterName );
- $times = $wgMemc->get( $memcKey );
+ $times = $cache->get( $memcKey );
if ( is_array( $times ) ) {
# Randomly recache with probability rising over $expiry
$elapsed = time() - $times['timestamp'];
@@ -116,10 +121,10 @@
}
# Cache key missing or expired
- if ( $wgMemc->add( "$memcKey:lock", 1, 10 ) ) {
+ if ( $cache->add( "$memcKey:lock", 1, 10 ) ) {
# Let this process alone update the cache value
- $unlocker = new ScopedCallback( function () use (
$wgMemc, $memcKey ) {
- $wgMemc->delete( $memcKey );
+ $unlocker = new ScopedCallback( function () use (
$cache, $memcKey ) {
+ $cache->delete( $memcKey );
} );
} elseif ( is_array( $times ) ) {
# Could not acquire lock but an old cache exists, so
use it
@@ -136,12 +141,17 @@
$times[$i] = $conn->getLag();
} elseif ( false !== ( $conn =
$this->parent->openConnection( $i, $wiki ) ) ) {
$times[$i] = $conn->getLag();
+ // Close the connection to avoid sleeper
connections piling up.
+ // Note that the caller will pick one of these
DBs are reconnect,
+ // which is slightly inefficient, but this only
matters for the lag
+ // time cache miss cache, which is far less
common that cache hits.
+ $this->parent->closeConnection( $conn );
}
}
# Add a timestamp key so we know when it was cached
$times['timestamp'] = time();
- $wgMemc->set( $memcKey, $times, $expiry + 10 );
+ $cache->set( $memcKey, $times, $expiry + 10 );
unset( $times['timestamp'] ); // hide from caller
return $times;
--
To view, visit https://gerrit.wikimedia.org/r/155587
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I65a2c46b49a2d79e014b910a7f7357aa64964690
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Aaron Schulz <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits