From 9c8d885060363a2c5df3ab8f2e68a5a5ef5d7894 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Wed, 14 Sep 2016 00:10:11 -0700 Subject: [PATCH] Move LoadMonitor classes to libs/rdbms/loadmonitor Change-Id: Ib18108f24ff8b9d05dc324bad132f597b3e2ddef --- autoload.php | 6 +-- includes/db/loadbalancer/LBFactory.php | 15 +++++-- includes/db/loadbalancer/LoadBalancer.php | 9 ++++- .../rdbms/loadmonitor}/LoadMonitor.php | 38 +++++------------- .../rdbms/loadmonitor}/LoadMonitorMySQL.php | 13 +++--- .../rdbms/loadmonitor/LoadMonitorNull.php | 40 +++++++++++++++++++ 6 files changed, 80 insertions(+), 41 deletions(-) rename includes/{db/loadbalancer => libs/rdbms/loadmonitor}/LoadMonitor.php (67%) rename includes/{db/loadbalancer => libs/rdbms/loadmonitor}/LoadMonitorMySQL.php (94%) create mode 100644 includes/libs/rdbms/loadmonitor/LoadMonitorNull.php diff --git a/autoload.php b/autoload.php index 6654f5bf74..a71d9432e7 100644 --- a/autoload.php +++ b/autoload.php @@ -729,9 +729,9 @@ $wgAutoloadLocalClasses = [ 'ListredirectsPage' => __DIR__ . '/includes/specials/SpecialListredirects.php', 'LoadBalancer' => __DIR__ . '/includes/db/loadbalancer/LoadBalancer.php', 'LoadBalancerSingle' => __DIR__ . '/includes/db/loadbalancer/LBFactorySingle.php', - 'LoadMonitor' => __DIR__ . '/includes/db/loadbalancer/LoadMonitor.php', - 'LoadMonitorMySQL' => __DIR__ . '/includes/db/loadbalancer/LoadMonitorMySQL.php', - 'LoadMonitorNull' => __DIR__ . '/includes/db/loadbalancer/LoadMonitor.php', + 'LoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitor.php', + 'LoadMonitorMySQL' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php', + 'LoadMonitorNull' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php', 'LocalFile' => __DIR__ . '/includes/filerepo/file/LocalFile.php', 'LocalFileDeleteBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php', 'LocalFileLockError' => __DIR__ . '/includes/filerepo/file/LocalFile.php', diff --git a/includes/db/loadbalancer/LBFactory.php b/includes/db/loadbalancer/LBFactory.php index 22a6597c2d..5115fbecae 100644 --- a/includes/db/loadbalancer/LBFactory.php +++ b/includes/db/loadbalancer/LBFactory.php @@ -41,6 +41,8 @@ abstract class LBFactory implements DestructibleService { protected $replLogger; /** @var BagOStuff */ protected $srvCache; + /** @var BagOStuff */ + protected $memCache; /** @var WANObjectCache */ protected $wanCache; @@ -69,12 +71,18 @@ abstract class LBFactory implements DestructibleService { $this->chronProt = $this->newChronologyProtector(); $this->trxProfiler = Profiler::instance()->getTransactionProfiler(); // Use APC/memcached style caching, but avoids loops with CACHE_DB (T141804) - $cache = ObjectCache::getLocalServerInstance(); - if ( $cache->getQoS( $cache::ATTR_EMULATION ) > $cache::QOS_EMULATION_SQL ) { - $this->srvCache = $cache; + $sCache = ObjectCache::getLocalServerInstance(); + if ( $sCache->getQoS( $sCache::ATTR_EMULATION ) > $sCache::QOS_EMULATION_SQL ) { + $this->srvCache = $sCache; } else { $this->srvCache = new EmptyBagOStuff(); } + $cCache = ObjectCache::getLocalClusterInstance(); + if ( $cCache->getQoS( $cCache::ATTR_EMULATION ) > $cCache::QOS_EMULATION_SQL ) { + $this->memCache = $cCache; + } else { + $this->memCache = new EmptyBagOStuff(); + } $wCache = ObjectCache::getMainWANInstance(); if ( $wCache->getQoS( $wCache::ATTR_EMULATION ) > $wCache::QOS_EMULATION_SQL ) { $this->wanCache = $wCache; @@ -655,6 +663,7 @@ abstract class LBFactory implements DestructibleService { 'localDomain' => wfWikiID(), 'readOnlyReason' => $this->readOnlyReason, 'srvCache' => $this->srvCache, + 'memCache' => $this->memCache, 'wanCache' => $this->wanCache, 'trxProfiler' => $this->trxProfiler, 'queryLogger' => LoggerFactory::getInstance( 'DBQuery' ), diff --git a/includes/db/loadbalancer/LoadBalancer.php b/includes/db/loadbalancer/LoadBalancer.php index 687317cb5d..8069cf6fc7 100644 --- a/includes/db/loadbalancer/LoadBalancer.php +++ b/includes/db/loadbalancer/LoadBalancer.php @@ -47,6 +47,8 @@ class LoadBalancer implements ILoadBalancer { private $mLoadMonitor; /** @var BagOStuff */ private $srvCache; + /** @var BagOStuff */ + private $memCache; /** @var WANObjectCache */ private $wanCache; /** @var TransactionProfiler */ @@ -149,6 +151,11 @@ class LoadBalancer implements ILoadBalancer { } else { $this->srvCache = new EmptyBagOStuff(); } + if ( isset( $params['memCache'] ) ) { + $this->memCache = $params['memCache']; + } else { + $this->memCache = new EmptyBagOStuff(); + } if ( isset( $params['wanCache'] ) ) { $this->wanCache = $params['wanCache']; } else { @@ -179,7 +186,7 @@ class LoadBalancer implements ILoadBalancer { private function getLoadMonitor() { if ( !isset( $this->mLoadMonitor ) ) { $class = $this->mLoadMonitorClass; - $this->mLoadMonitor = new $class( $this ); + $this->mLoadMonitor = new $class( $this, $this->srvCache, $this->memCache ); $this->mLoadMonitor->setLogger( $this->replLogger ); } diff --git a/includes/db/loadbalancer/LoadMonitor.php b/includes/libs/rdbms/loadmonitor/LoadMonitor.php similarity index 67% rename from includes/db/loadbalancer/LoadMonitor.php rename to includes/libs/rdbms/loadmonitor/LoadMonitor.php index 247955a8f0..46af068bab 100644 --- a/includes/db/loadbalancer/LoadMonitor.php +++ b/includes/libs/rdbms/loadmonitor/LoadMonitor.php @@ -21,7 +21,6 @@ * @ingroup Database */ use Psr\Log\LoggerAwareInterface; -use Psr\Log\LoggerInterface; /** * An interface for database load monitoring @@ -32,29 +31,31 @@ interface LoadMonitor extends LoggerAwareInterface { /** * Construct a new LoadMonitor with a given LoadBalancer parent * - * @param LoadBalancer $parent + * @param BagOStuff $sCache Server local memory cache + * @param BagOStuff $cCache Server local memory cache + * @param ILoadBalancer $parent LoadBalancer this instance serves */ - public function __construct( LoadBalancer $parent ); + public function __construct( ILoadBalancer $parent, BagOStuff $sCache, BagOStuff $cCache ); /** * Perform pre-connection load ratio adjustment. - * @param array &$loads + * @param int[] &$loads * @param string|bool $group The selected query group. Default: false - * @param string|bool $wiki Default: false + * @param string|bool $domain Default: false */ - public function scaleLoads( &$loads, $group = false, $wiki = false ); + public function scaleLoads( &$loads, $group = false, $domain = false ); /** * Get an estimate of replication lag (in seconds) for each server * * Values may be "false" if replication is too broken to estimate * - * @param array $serverIndexes - * @param string $wiki + * @param integer[] $serverIndexes + * @param string $domain * * @return array Map of (server index => float|int|bool) */ - public function getLagTimes( $serverIndexes, $wiki ); + public function getLagTimes( $serverIndexes, $domain ); /** * Clear any process and persistent cache of lag times @@ -62,22 +63,3 @@ interface LoadMonitor extends LoggerAwareInterface { */ public function clearCaches(); } - -class LoadMonitorNull implements LoadMonitor { - public function __construct( LoadBalancer $parent ) { - } - - public function setLogger( LoggerInterface $logger ) { - } - - public function scaleLoads( &$loads, $group = false, $wiki = false ) { - } - - public function getLagTimes( $serverIndexes, $wiki ) { - return array_fill_keys( $serverIndexes, 0 ); - } - - public function clearCaches() { - - } -} diff --git a/includes/db/loadbalancer/LoadMonitorMySQL.php b/includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php similarity index 94% rename from includes/db/loadbalancer/LoadMonitorMySQL.php rename to includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php index 7238388944..83f4462287 100644 --- a/includes/db/loadbalancer/LoadMonitorMySQL.php +++ b/includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php @@ -28,8 +28,8 @@ use Psr\Log\LoggerInterface; * @ingroup Database */ class LoadMonitorMySQL implements LoadMonitor { - /** @var LoadBalancer */ - public $parent; + /** @var ILoadBalancer */ + protected $parent; /** @var BagOStuff */ protected $srvCache; /** @var BagOStuff */ @@ -37,10 +37,10 @@ class LoadMonitorMySQL implements LoadMonitor { /** @var LoggerInterface */ protected $replLogger; - public function __construct( LoadBalancer $parent ) { + public function __construct( ILoadBalancer $parent, BagOStuff $sCache, BagOStuff $cCache ) { $this->parent = $parent; - $this->srvCache = ObjectCache::getLocalServerInstance( 'hash' ); - $this->mainCache = ObjectCache::getLocalClusterInstance(); + $this->srvCache = $sCache; + $this->mainCache = $cCache; $this->replLogger = new \Psr\Log\NullLogger(); } @@ -150,7 +150,8 @@ class LoadMonitorMySQL implements LoadMonitor { $writerIndex = $this->parent->getWriterIndex(); // Lag is per-server, not per-DB, so key on the master DB name return $this->srvCache->makeGlobalKey( - 'lag-times', $this->parent->getServerName( $writerIndex ) + 'lag-times', + $this->parent->getServerName( $writerIndex ) ); } } diff --git a/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php b/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php new file mode 100644 index 0000000000..df95b0a4e2 --- /dev/null +++ b/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php @@ -0,0 +1,40 @@ +