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

Reply via email to