MediaWiki  master
Wikimedia\Rdbms\LBFactoryMulti Class Reference

A multi-database, multi-primary DB factory for Wikimedia and similar installations. More...

Inheritance diagram for Wikimedia\Rdbms\LBFactoryMulti:
Collaboration diagram for Wikimedia\Rdbms\LBFactoryMulti:

Public Member Functions

 __construct (array $conf)
 Template override precedence (highest => lowest): More...
 
 forEachLB ( $callback, array $params=[])
 Execute a function for each instantiated tracked load balancer instance. More...
 
 getAllExternalLBs ()
 Get the tracked load balancer instances for all external clusters. More...
 
 getAllMainLBs ()
 Get the tracked load balancer instances for all main clusters. More...
 
 getExternalLB ( $cluster)
 Get the tracked load balancer instance for an external cluster. More...
 
 getMainLB ( $domain=false)
 Get the tracked load balancer instance for a main cluster. More...
 
 newExternalLB ( $cluster, $owner=null)
 Create a new load balancer instance for an external cluster. More...
 
 newMainLB ( $domain=false, $owner=null)
 Create a new load balancer instance for a main cluster. More...
 
- Public Member Functions inherited from Wikimedia\Rdbms\LBFactory
 __destruct ()
 
 appendShutdownCPIndexAsQuery ( $url, $index)
 Append ?cpPosIndex parameter to a URL for ChronologyProtector purposes if needed. More...
 
 beginMasterChanges ( $fname=__METHOD__)
 
 beginPrimaryChanges ( $fname=__METHOD__)
 Flush any primary transaction snapshots and set DBO_TRX (if DBO_DEFAULT is set) More...
 
 closeAll ()
 Close all connections on instantiated tracked load balancer instances. More...
 
 commitAll ( $fname=__METHOD__, array $options=[])
 Commit open transactions on all connections. More...
 
 commitAndWaitForReplication ( $fname, $ticket, array $opts=[])
 Call commitPrimaryChanges() and waitForReplication() if $ticket indicates it is safe. More...
 
 commitMasterChanges ( $fname=__METHOD__, array $options=[])
 
 commitPrimaryChanges ( $fname=__METHOD__, array $options=[])
 Commit changes and clear view snapshots on all primary connections. More...
 
 destroy ()
 Close all connections and make further attempts to open connections result in DBAccessError. More...
 
 disableChronologyProtection ()
 Disable the ChronologyProtector on all instantiated tracked load balancer instances. More...
 
 flushReplicaSnapshots ( $fname=__METHOD__)
 Commit all replica DB transactions so as to flush any REPEATABLE-READ or SSI snapshot. More...
 
 getChronologyProtectorClientId ()
 Get the client ID of the ChronologyProtector instance. More...
 
 getChronologyProtectorTouched ( $domain=false)
 Get the UNIX timestamp when the client last touched the DB, if they did so recently. More...
 
 getEmptyTransactionTicket ( $fname)
 Get a token asserting that no transaction writes are active on tracked load balancers. More...
 
 getLocalDomainID ()
 Get the local (and default) database domain ID of connection handles. More...
 
 getTransactionProfiler ()
 Get the TransactionProfiler used by this instance. More...
 
 hasMasterChanges ()
 
 hasOrMadeRecentMasterChanges ( $age=null)
 
 hasOrMadeRecentPrimaryChanges ( $age=null)
 Determine if any primary connection has pending/written changes from this request. More...
 
 hasPrimaryChanges ()
 Determine if any primary connection has pending changes. More...
 
 hasTransactionRound ()
 Check if an explicit transaction round is active. More...
 
 isReadyForRoundOperations ()
 Check if transaction rounds can be started, committed, or rolled back right now. More...
 
 laggedReplicaUsed ()
 Detemine if any lagged replica DB connection was used. More...
 
 redefineLocalDomain ( $domain)
 Close all connections and redefine the local domain for testing or schema creation. More...
 
 resolveDomainID ( $domain)
 
 rollbackMasterChanges ( $fname=__METHOD__)
 
 rollbackPrimaryChanges ( $fname=__METHOD__)
 Rollback changes on all primary connections. More...
 
 setAgentName ( $agent)
 
 setDefaultReplicationWaitTimeout ( $seconds)
 Set the default timeout for replication wait checks. More...
 
 setDomainAliases (array $aliases)
 Convert certain database domains to alternative ones. More...
 
 setIndexAliases (array $aliases)
 Convert certain index names to alternative names before querying the DB. More...
 
 setLocalDomainPrefix ( $prefix)
 Set a new table prefix for the existing local domain ID for testing. More...
 
 setMockTime (&$time)
 
 setRequestInfo (array $info)
 Inject HTTP request header/cookie information during setup of this instance. More...
 
 setTableAliases (array $aliases)
 Make certain table names use their own database, schema, and table prefix when passed into SQL queries pre-escaped and without a qualified database name. More...
 
 setWaitForReplicationListener ( $name, callable $callback=null)
 Add a callback to be run in every call to waitForReplication() before waiting. More...
 
 shutdown ( $flags=self::SHUTDOWN_NORMAL, callable $workCallback=null, &$cpIndex=null, &$cpClientId=null)
 Prepare all instantiated tracked load balancer instances for shutdown. More...
 
 waitForReplication (array $opts=[])
 Waits for the replica DBs to catch up to the current primary position. More...
 

Private Member Functions

 getSectionFromDatabase ( $database)
 
 makeServerConfigArrays (array $serverTemplate, array $groupLoads)
 Make a server array as expected by LoadBalancer::__construct() More...
 
 newLoadBalancer (string $clusterName, array $serverTemplate, array $groupLoads, $readOnlyReason, $owner)
 Make a new load balancer object based on template and load array. More...
 
 reindexGroupLoadsByServerName (array $groupLoads)
 Take a group load array indexed by (group,server) and reindex it by (server,group) More...
 

Private Attributes

array< string, LoadBalancer$externalLBs = []
 Map of (external cluster => tracked LoadBalancer) More...
 
int[][] $externalLoadsByCluster
 Map of (external cluster => server name => load ratio) More...
 
array $externalTemplateOverrides
 Server config map overriding "serverTemplate" for all external servers. More...
 
int[][][] $groupLoadsByDB
 Map of (database => group => server name => load ratio) More...
 
int[][][] $groupLoadsBySection
 Map of (main section => group => server name => load ratio) More...
 
string[] $hostsByServerName
 Map of (server name => IP address) More...
 
array $loadMonitorConfig
 Configuration for the LoadMonitor to use within LoadBalancer instances. More...
 
array< string, LoadBalancer$mainLBs = []
 Map of (main section => tracked LoadBalancer) More...
 
array $masterTemplateOverrides
 Server config override map for all main/external primary DB servers. More...
 
string[] bool[] $readOnlyBySection
 A map of (main section => read-only message) More...
 
string[] $sectionsByDB
 Map of (database name => main section) More...
 
array $serverTemplate
 Server config map ("host", "serverName", "load", and "groupLoads" ignored) More...
 
array[] $templateOverridesByCluster
 Map of (external cluster => server config map overrides) More...
 
array[] $templateOverridesBySection
 Map of (main section => server config map overrides) More...
 
array[] $templateOverridesByServer
 Map of (server name => server config map overrides) for all servers. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from Wikimedia\Rdbms\LBFactory
static getCPInfoFromCookieValue (?string $value, int $minTimestamp)
 Parse a string conveying the client and write index of the chronology protector data. More...
 
static makeCookieValueFromCPIndex (int $writeIndex, int $time, string $clientId)
 Build a string conveying the client and write index of the chronology protector data. More...
 
- Public Attributes inherited from Wikimedia\Rdbms\ILBFactory
const SHUTDOWN_NO_CHRONPROT = 1
 Do not save "session consistency" DB replication positions. More...
 
const SHUTDOWN_NORMAL = 0
 Idion for "no special shutdown flags". More...
 
- Protected Member Functions inherited from Wikimedia\Rdbms\LBFactory
 baseLoadBalancerParams ( $owner)
 Get parameters to ILoadBalancer::__construct() More...
 
 forEachLBCallMethod ( $methodName, array $args=[])
 Call a method on each tracked (instantiated) load balancer instance. More...
 
 getChronologyProtector ()
 
 getOwnershipId ()
 
 initLoadBalancer (ILoadBalancer $lb)
 
 resolveDomainInstance ( $domain)
 
 shutdownChronologyProtector (ChronologyProtector $cp, $workCallback, &$cpIndex=null)
 Get and record all of the staged DB positions into persistent memory storage. More...
 
- Protected Attributes inherited from Wikimedia\Rdbms\LBFactory
BagOStuff $cpStash
 
DatabaseDomain $localDomain
 Local domain. More...
 
int null $maxLag
 
string bool $readOnlyReason = false
 Reason all LBs are read-only or false if not. More...
 
BagOStuff $srvCache
 
WANObjectCache $wanCache
 

Detailed Description

A multi-database, multi-primary DB factory for Wikimedia and similar installations.

Definition at line 35 of file LBFactoryMulti.php.

Constructor & Destructor Documentation

◆ __construct()

Wikimedia\Rdbms\LBFactoryMulti::__construct ( array  $conf)

Template override precedence (highest => lowest):

  • templateOverridesByServer
  • masterTemplateOverrides
  • templateOverridesBySection/templateOverridesByCluster
  • externalTemplateOverrides
  • serverTemplate Overrides only work on top level keys (so nested values will not be merged).

Server config maps should be of the format Database::factory() requires. Additionally, a 'max lag' key should also be set on server maps, indicating how stale the data can be before the load balancer tries to avoid using it. The map can have 'is static' set to disable blocking replication sync checks (intended for archive servers with unchanging data).

See also
LBFactory::__construct()
Parameters
array$confAdditional parameters include:
  • hostsByName: map of (server name => IP address). [optional]
  • sectionsByDB: map of (database => main section). The database name "DEFAULT" is interpeted as a catch-all for all databases not otherwise mentioned. [optional]
  • sectionLoads: map of (main section => server name => load ratio); the first host listed in each section is the primary DB server for that section. [optional]
  • groupLoadsBySection: map of (main section => group => server name => group load ratio). Any ILoadBalancer::GROUP_GENERIC group will be ignored. [optional]
  • groupLoadsByDB: map of (database => group => server name => load ratio) map. [optional]
  • externalLoads: map of (cluster => server name => load ratio) map. [optional]
  • serverTemplate: server config map for Database::factory(). Note that "host", "serverName" and "load" entries will be overridden by "groupLoadsBySection" and "hostsByName". [optional]
  • externalTemplateOverrides: server config map overrides for external stores; respects the override precedence described above. [optional]
  • templateOverridesBySection: map of (main section => server config map overrides); respects the override precedence described above. [optional]
  • templateOverridesByCluster: map of (external cluster => server config map overrides); respects the override precedence described above. [optional]
  • masterTemplateOverrides: server config map overrides for masters; respects the override precedence described above. [optional]
  • templateOverridesByServer: map of (server name => server config map overrides); respects the override precedence described above and applies to both core and external storage. [optional]
  • loadMonitor: LoadMonitor::__construct() parameters with "class" field. [optional]
  • readOnlyBySection: map of (main section => message text or false). String values make sections read only, whereas anything else does not restrict read/write mode. [optional]

Reimplemented from Wikimedia\Rdbms\LBFactory.

Definition at line 113 of file LBFactoryMulti.php.

References Wikimedia\Rdbms\ILoadBalancer\GROUP_GENERIC.

Member Function Documentation

◆ forEachLB()

Wikimedia\Rdbms\LBFactoryMulti::forEachLB (   $callback,
array  $params = [] 
)

Execute a function for each instantiated tracked load balancer instance.

The callback is called with the load balancer as the first parameter, and $params passed as the subsequent parameters.

Parameters
callable$callback
array$params

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 234 of file LBFactoryMulti.php.

◆ getAllExternalLBs()

Wikimedia\Rdbms\LBFactoryMulti::getAllExternalLBs ( )

Get the tracked load balancer instances for all external clusters.

If no tracked instance exists for a cluster, then one will be instantiated

Returns
ILoadBalancer[] Map of (cluster name => ILoadBalancer)
Since
1.29

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 225 of file LBFactoryMulti.php.

References Wikimedia\Rdbms\LBFactoryMulti\getExternalLB().

◆ getAllMainLBs()

Wikimedia\Rdbms\LBFactoryMulti::getAllMainLBs ( )

Get the tracked load balancer instances for all main clusters.

If no tracked instance exists for a cluster, then one will be instantiated

Note that default main cluster name is ILoadBalancer::CLUSTER_MAIN_DEFAULT

Returns
ILoadBalancer[] Map of (cluster name => ILoadBalancer)
Since
1.29

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 214 of file LBFactoryMulti.php.

References Wikimedia\Rdbms\LBFactoryMulti\getMainLB().

◆ getExternalLB()

Wikimedia\Rdbms\LBFactoryMulti::getExternalLB (   $cluster)

Get the tracked load balancer instance for an external cluster.

If no tracked instances exists, then one will be instantiated

Parameters
string$clusterExternal cluster name
Returns
ILoadBalancer

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 203 of file LBFactoryMulti.php.

References Wikimedia\Rdbms\LBFactory\getOwnershipId(), and Wikimedia\Rdbms\LBFactoryMulti\newExternalLB().

Referenced by Wikimedia\Rdbms\LBFactoryMulti\getAllExternalLBs().

◆ getMainLB()

Wikimedia\Rdbms\LBFactoryMulti::getMainLB (   $domain = false)

Get the tracked load balancer instance for a main cluster.

If no tracked instances exists, then one will be instantiated

Parameters
bool | string$domainDomain ID, or false for the current domain
Returns
ILoadBalancer

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 175 of file LBFactoryMulti.php.

References Wikimedia\Rdbms\LBFactory\getOwnershipId(), Wikimedia\Rdbms\LBFactoryMulti\getSectionFromDatabase(), Wikimedia\Rdbms\LBFactoryMulti\newMainLB(), and Wikimedia\Rdbms\LBFactory\resolveDomainInstance().

Referenced by Wikimedia\Rdbms\LBFactoryMulti\getAllMainLBs().

◆ getSectionFromDatabase()

Wikimedia\Rdbms\LBFactoryMulti::getSectionFromDatabase (   $database)
private
Parameters
string$database
Returns
string Section name

Definition at line 330 of file LBFactoryMulti.php.

Referenced by Wikimedia\Rdbms\LBFactoryMulti\getMainLB(), and Wikimedia\Rdbms\LBFactoryMulti\newMainLB().

◆ makeServerConfigArrays()

Wikimedia\Rdbms\LBFactoryMulti::makeServerConfigArrays ( array  $serverTemplate,
array  $groupLoads 
)
private

Make a server array as expected by LoadBalancer::__construct()

Parameters
array$serverTemplateServer config map
int[][]$groupLoadsMap of (group => server name => load)
Returns
array[] List of server config maps

Definition at line 281 of file LBFactoryMulti.php.

References Wikimedia\Rdbms\LBFactoryMulti\$serverTemplate, Wikimedia\Rdbms\ILoadBalancer\GROUP_GENERIC, and Wikimedia\Rdbms\LBFactoryMulti\reindexGroupLoadsByServerName().

Referenced by Wikimedia\Rdbms\LBFactoryMulti\newLoadBalancer().

◆ newExternalLB()

Wikimedia\Rdbms\LBFactoryMulti::newExternalLB (   $cluster,
  $owner = null 
)

Create a new load balancer instance for an external cluster.

The resulting object will be untracked and the caller is responsible for cleaning it up. Database replication positions will not be saved by ChronologyProtector.

This method is for only advanced usage and callers should almost always use getExternalLB() instead. This method can be useful when a table is used as a key/value store. In that cases, one might want to query it in autocommit mode (DBO_TRX off) but still use DBO_TRX transaction rounds on other tables.

Parameters
string$clusterExternal cluster name
int | null$ownerOwner ID of the new instance (e.g. this LBFactory ID)
Returns
ILoadBalancer

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 186 of file LBFactoryMulti.php.

References Wikimedia\Rdbms\ILoadBalancer\GROUP_GENERIC, and Wikimedia\Rdbms\LBFactoryMulti\newLoadBalancer().

Referenced by Wikimedia\Rdbms\LBFactoryMulti\getExternalLB().

◆ newLoadBalancer()

Wikimedia\Rdbms\LBFactoryMulti::newLoadBalancer ( string  $clusterName,
array  $serverTemplate,
array  $groupLoads,
  $readOnlyReason,
  $owner 
)
private

Make a new load balancer object based on template and load array.

Parameters
string$clusterName
array$serverTemplate
array$groupLoads
string | bool$readOnlyReason
int | null$owner
Returns
LoadBalancer

Definition at line 253 of file LBFactoryMulti.php.

References Wikimedia\Rdbms\LBFactory\$readOnlyReason, Wikimedia\Rdbms\LBFactory\baseLoadBalancerParams(), Wikimedia\Rdbms\LBFactory\initLoadBalancer(), and Wikimedia\Rdbms\LBFactoryMulti\makeServerConfigArrays().

Referenced by Wikimedia\Rdbms\LBFactoryMulti\newExternalLB(), and Wikimedia\Rdbms\LBFactoryMulti\newMainLB().

◆ newMainLB()

Wikimedia\Rdbms\LBFactoryMulti::newMainLB (   $domain = false,
  $owner = null 
)

Create a new load balancer instance for a main cluster.

The resulting object will be untracked and the caller is responsible for cleaning it up. Database replication positions will not be saved by ChronologyProtector.

This method is for only advanced usage and callers should almost always use getMainLB() instead. This method can be useful when a table is used as a key/value store. In that cases, one might want to query it in autocommit mode (DBO_TRX off) but still use DBO_TRX transaction rounds on other tables.

Parameters
bool | string$domainDomain ID, or false for the current domain
int | null$ownerOwner ID of the new instance (e.g. this LBFactory ID)
Returns
ILoadBalancer

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 149 of file LBFactoryMulti.php.

References Wikimedia\Rdbms\LBFactoryMulti\getSectionFromDatabase(), Wikimedia\Rdbms\ILoadBalancer\GROUP_GENERIC, Wikimedia\Rdbms\LBFactoryMulti\newLoadBalancer(), and Wikimedia\Rdbms\LBFactory\resolveDomainInstance().

Referenced by Wikimedia\Rdbms\LBFactoryMulti\getMainLB().

◆ reindexGroupLoadsByServerName()

Wikimedia\Rdbms\LBFactoryMulti::reindexGroupLoadsByServerName ( array  $groupLoads)
private

Take a group load array indexed by (group,server) and reindex it by (server,group)

Parameters
int[][]$groupLoadsMap of (group => server name => load)
Returns
int[][] Map of (server name => group => load)

Definition at line 315 of file LBFactoryMulti.php.

Referenced by Wikimedia\Rdbms\LBFactoryMulti\makeServerConfigArrays().

Member Data Documentation

◆ $externalLBs

array<string,LoadBalancer> Wikimedia\Rdbms\LBFactoryMulti::$externalLBs = []
private

Map of (external cluster => tracked LoadBalancer)

Definition at line 39 of file LBFactoryMulti.php.

◆ $externalLoadsByCluster

int [][] Wikimedia\Rdbms\LBFactoryMulti::$externalLoadsByCluster
private

Map of (external cluster => server name => load ratio)

Definition at line 50 of file LBFactoryMulti.php.

◆ $externalTemplateOverrides

array Wikimedia\Rdbms\LBFactoryMulti::$externalTemplateOverrides
private

Server config map overriding "serverTemplate" for all external servers.

Definition at line 54 of file LBFactoryMulti.php.

◆ $groupLoadsByDB

int [][][] Wikimedia\Rdbms\LBFactoryMulti::$groupLoadsByDB
private

Map of (database => group => server name => load ratio)

Definition at line 48 of file LBFactoryMulti.php.

◆ $groupLoadsBySection

int [][][] Wikimedia\Rdbms\LBFactoryMulti::$groupLoadsBySection
private

Map of (main section => group => server name => load ratio)

Definition at line 46 of file LBFactoryMulti.php.

◆ $hostsByServerName

string [] Wikimedia\Rdbms\LBFactoryMulti::$hostsByServerName
private

Map of (server name => IP address)

Definition at line 42 of file LBFactoryMulti.php.

◆ $loadMonitorConfig

array Wikimedia\Rdbms\LBFactoryMulti::$loadMonitorConfig
private

Configuration for the LoadMonitor to use within LoadBalancer instances.

Definition at line 66 of file LBFactoryMulti.php.

◆ $mainLBs

array<string,LoadBalancer> Wikimedia\Rdbms\LBFactoryMulti::$mainLBs = []
private

Map of (main section => tracked LoadBalancer)

Definition at line 37 of file LBFactoryMulti.php.

◆ $masterTemplateOverrides

array Wikimedia\Rdbms\LBFactoryMulti::$masterTemplateOverrides
private

Server config override map for all main/external primary DB servers.

Definition at line 60 of file LBFactoryMulti.php.

◆ $readOnlyBySection

string [] bool [] Wikimedia\Rdbms\LBFactoryMulti::$readOnlyBySection
private

A map of (main section => read-only message)

Definition at line 64 of file LBFactoryMulti.php.

◆ $sectionsByDB

string [] Wikimedia\Rdbms\LBFactoryMulti::$sectionsByDB
private

Map of (database name => main section)

Definition at line 44 of file LBFactoryMulti.php.

◆ $serverTemplate

array Wikimedia\Rdbms\LBFactoryMulti::$serverTemplate
private

Server config map ("host", "serverName", "load", and "groupLoads" ignored)

Definition at line 52 of file LBFactoryMulti.php.

Referenced by Wikimedia\Rdbms\LBFactoryMulti\makeServerConfigArrays().

◆ $templateOverridesByCluster

array [] Wikimedia\Rdbms\LBFactoryMulti::$templateOverridesByCluster
private

Map of (external cluster => server config map overrides)

Definition at line 58 of file LBFactoryMulti.php.

◆ $templateOverridesBySection

array [] Wikimedia\Rdbms\LBFactoryMulti::$templateOverridesBySection
private

Map of (main section => server config map overrides)

Definition at line 56 of file LBFactoryMulti.php.

◆ $templateOverridesByServer

array [] Wikimedia\Rdbms\LBFactoryMulti::$templateOverridesByServer
private

Map of (server name => server config map overrides) for all servers.

Definition at line 62 of file LBFactoryMulti.php.


The documentation for this class was generated from the following file: