From 0ded1a890c1255f787cb1cad9b6c83899634b37f Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Wed, 22 Nov 2017 08:03:33 -0800 Subject: [PATCH] Add "maxLag" parameter to LBFactory sub-classes and LoadBalancer Change-Id: I2559e81a4a67036a899fec10582ac1ccb3818cf1 --- includes/libs/rdbms/lbfactory/LBFactoryMulti.php | 10 +++++++++- includes/libs/rdbms/lbfactory/LBFactorySimple.php | 7 +++++++ includes/libs/rdbms/loadbalancer/ILoadBalancer.php | 1 + includes/libs/rdbms/loadbalancer/LoadBalancer.php | 10 ++++++++-- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/includes/libs/rdbms/lbfactory/LBFactoryMulti.php b/includes/libs/rdbms/lbfactory/LBFactoryMulti.php index 0384588ddc..cfa26479bb 100644 --- a/includes/libs/rdbms/lbfactory/LBFactoryMulti.php +++ b/includes/libs/rdbms/lbfactory/LBFactoryMulti.php @@ -107,6 +107,12 @@ class LBFactoryMulti extends LBFactory { /** @var string */ private $lastSection; + /** @var int */ + private $maxLag = self::MAX_LAG_DEFAULT; + + /** @var int Default 'maxLag' when unspecified */ + const MAX_LAG_DEFAULT = 10; + /** * @see LBFactory::__construct() * @@ -160,6 +166,7 @@ class LBFactoryMulti extends LBFactory { * storage cluster. * - masterTemplateOverrides Server configuration map overrides for all master servers. * - loadMonitorClass Name of the LoadMonitor class to always use. + * - maxLag Avoid replica DBs with more lag than this many seconds. * - readOnlyBySection A map of section name to read-only message. * Missing or false for read/write. */ @@ -171,7 +178,7 @@ class LBFactoryMulti extends LBFactory { $optional = [ 'groupLoadsBySection', 'groupLoadsByDB', 'hostsByName', 'externalLoads', 'externalTemplateOverrides', 'templateOverridesByServer', 'templateOverridesByCluster', 'templateOverridesBySection', 'masterTemplateOverrides', - 'readOnlyBySection', 'loadMonitorClass' ]; + 'readOnlyBySection', 'maxLag', 'loadMonitorClass' ]; foreach ( $required as $key ) { if ( !isset( $conf[$key] ) ) { @@ -319,6 +326,7 @@ class LBFactoryMulti extends LBFactory { $this->baseLoadBalancerParams(), [ 'servers' => $this->makeServerArray( $template, $loads, $groupLoads ), + 'maxLag' => $this->maxLag, 'loadMonitor' => [ 'class' => $this->loadMonitorClass ], 'readOnlyReason' => $readOnlyReason ] diff --git a/includes/libs/rdbms/lbfactory/LBFactorySimple.php b/includes/libs/rdbms/lbfactory/LBFactorySimple.php index df0a806b41..9a6aa3a74d 100644 --- a/includes/libs/rdbms/lbfactory/LBFactorySimple.php +++ b/includes/libs/rdbms/lbfactory/LBFactorySimple.php @@ -41,6 +41,11 @@ class LBFactorySimple extends LBFactory { /** @var string */ private $loadMonitorClass; + /** @var int */ + private $maxLag; + + /** @var int Default 'maxLag' when unspecified */ + const MAX_LAG_DEFAULT = 10; /** * @see LBFactory::__construct() @@ -72,6 +77,7 @@ class LBFactorySimple extends LBFactory { $this->loadMonitorClass = isset( $conf['loadMonitorClass'] ) ? $conf['loadMonitorClass'] : 'LoadMonitor'; + $this->maxLag = isset( $conf['maxLag'] ) ? $conf['maxLag'] : self::MAX_LAG_DEFAULT; } /** @@ -128,6 +134,7 @@ class LBFactorySimple extends LBFactory { $this->baseLoadBalancerParams(), [ 'servers' => $servers, + 'maxLag' => $this->maxLag, 'loadMonitor' => [ 'class' => $this->loadMonitorClass ], ] ) ); diff --git a/includes/libs/rdbms/loadbalancer/ILoadBalancer.php b/includes/libs/rdbms/loadbalancer/ILoadBalancer.php index 22a58055d7..86c43350a0 100644 --- a/includes/libs/rdbms/loadbalancer/ILoadBalancer.php +++ b/includes/libs/rdbms/loadbalancer/ILoadBalancer.php @@ -96,6 +96,7 @@ interface ILoadBalancer { * - loadMonitor : Name of a class used to fetch server lag and load. * - readOnlyReason : Reason the master DB is read-only if so [optional] * - waitTimeout : Maximum time to wait for replicas for consistency [optional] + * - maxLag: Avoid replica DB servers with more lag than this [optional] * - srvCache : BagOStuff object for server cache [optional] * - wanCache : WANObjectCache object [optional] * - chronologyProtector: ChronologyProtector object [optional] diff --git a/includes/libs/rdbms/loadbalancer/LoadBalancer.php b/includes/libs/rdbms/loadbalancer/LoadBalancer.php index 6bb894547c..b622ddcf11 100644 --- a/includes/libs/rdbms/loadbalancer/LoadBalancer.php +++ b/includes/libs/rdbms/loadbalancer/LoadBalancer.php @@ -115,11 +115,13 @@ class LoadBalancer implements ILoadBalancer { private $disabled = false; /** @var bool */ private $chronProtInitialized = false; + /** @var int */ + private $maxLag = self::MAX_LAG_DEFAULT; /** @var int Warn when this many connection are held */ const CONN_HELD_WARN_THRESHOLD = 10; - /** @var int Default 'max lag' when unspecified */ + /** @var int Default 'maxLag' when unspecified */ const MAX_LAG_DEFAULT = 10; /** @var int Seconds to cache master server read-only status */ const TTL_CACHE_READONLY = 5; @@ -178,6 +180,10 @@ class LoadBalancer implements ILoadBalancer { $this->readOnlyReason = $params['readOnlyReason']; } + if ( isset( $params['maxLag'] ) ) { + $this->maxLag = $params['maxLag']; + } + if ( isset( $params['loadMonitor'] ) ) { $this->loadMonitorConfig = $params['loadMonitor']; } else { @@ -275,7 +281,7 @@ class LoadBalancer implements ILoadBalancer { # How much lag this server nominally is allowed to have $maxServerLag = isset( $this->mServers[$i]['max lag'] ) ? $this->mServers[$i]['max lag'] - : self::MAX_LAG_DEFAULT; // default + : $this->maxLag; // default # Constrain that futher by $maxLag argument $maxServerLag = min( $maxServerLag, $maxLag ); -- 2.20.1