Avoid useless delay and master connections in wfWaitForSlaves() in runJobs.php
* Some jobs, like Parsoid ones, do not actually do master DB updates Change-Id: I1a8830eafd7760d081df966bb423030dcdc96408
This commit is contained in:
parent
e4fc0b7721
commit
2979f0b6f1
3 changed files with 29 additions and 9 deletions
|
|
@ -3798,11 +3798,14 @@ function wfGetNull() {
|
||||||
* in maintenance scripts, to avoid causing too much lag. Of course, this is
|
* in maintenance scripts, to avoid causing too much lag. Of course, this is
|
||||||
* a no-op if there are no slaves.
|
* a no-op if there are no slaves.
|
||||||
*
|
*
|
||||||
* @param int|bool $maxLag (deprecated)
|
* @param float|null $ifWritesSince Only wait if writes were done since this UNIX timestamp
|
||||||
* @param string|bool $wiki Wiki identifier accepted by wfGetLB
|
* @param string|bool $wiki Wiki identifier accepted by wfGetLB
|
||||||
* @param string|bool $cluster Cluster name accepted by LBFactory. Default: false.
|
* @param string|bool $cluster Cluster name accepted by LBFactory. Default: false.
|
||||||
*/
|
*/
|
||||||
function wfWaitForSlaves( $maxLag = false, $wiki = false, $cluster = false ) {
|
function wfWaitForSlaves( $ifWritesSince = false, $wiki = false, $cluster = false ) {
|
||||||
|
// B/C: first argument used to be "max seconds of lag"; ignore such values
|
||||||
|
$ifWritesSince = ( $ifWritesSince > 1e9 ) ? $ifWritesSince : false;
|
||||||
|
|
||||||
if ( $cluster !== false ) {
|
if ( $cluster !== false ) {
|
||||||
$lb = wfGetLBFactory()->getExternalLB( $cluster );
|
$lb = wfGetLBFactory()->getExternalLB( $cluster );
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -3812,7 +3815,13 @@ function wfWaitForSlaves( $maxLag = false, $wiki = false, $cluster = false ) {
|
||||||
// bug 27975 - Don't try to wait for slaves if there are none
|
// bug 27975 - Don't try to wait for slaves if there are none
|
||||||
// Prevents permission error when getting master position
|
// Prevents permission error when getting master position
|
||||||
if ( $lb->getServerCount() > 1 ) {
|
if ( $lb->getServerCount() > 1 ) {
|
||||||
|
if ( $ifWritesSince && !$lb->isOpen( DB_MASTER ) ) {
|
||||||
|
return; // assume no writes done
|
||||||
|
}
|
||||||
$dbw = $lb->getConnection( DB_MASTER, array(), $wiki );
|
$dbw = $lb->getConnection( DB_MASTER, array(), $wiki );
|
||||||
|
if ( $ifWritesSince && $dbw->lastDoneWrites() < $ifWritesSince ) {
|
||||||
|
return; // no writes since the last wait
|
||||||
|
}
|
||||||
$pos = $dbw->getMasterPos();
|
$pos = $dbw->getMasterPos();
|
||||||
// The DBMS may not support getMasterPos() or the whole
|
// The DBMS may not support getMasterPos() or the whole
|
||||||
// load balancer might be fake (e.g. $wgAllDBsAreLocalhost).
|
// load balancer might be fake (e.g. $wgAllDBsAreLocalhost).
|
||||||
|
|
|
||||||
|
|
@ -600,7 +600,18 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function doneWrites() {
|
public function doneWrites() {
|
||||||
return $this->mDoneWrites;
|
return (bool)$this->mDoneWrites;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the last time the connection may have been used for write queries.
|
||||||
|
* Should return a timestamp if unsure.
|
||||||
|
*
|
||||||
|
* @return int|float UNIX timestamp or false
|
||||||
|
* @since 1.24
|
||||||
|
*/
|
||||||
|
public function lastDoneWrites() {
|
||||||
|
return $this->mDoneWrites ?: false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1020,10 +1031,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
|
||||||
global $wgUser, $wgDebugDBTransactions;
|
global $wgUser, $wgDebugDBTransactions;
|
||||||
|
|
||||||
$this->mLastQuery = $sql;
|
$this->mLastQuery = $sql;
|
||||||
if ( !$this->mDoneWrites && $this->isWriteQuery( $sql ) ) {
|
if ( $this->isWriteQuery( $sql ) ) {
|
||||||
# Set a flag indicating that writes have been done
|
# Set a flag indicating that writes have been done
|
||||||
wfDebug( __METHOD__ . ': Writes done: ' . DatabaseBase::generalizeSQL( $sql ) . "\n" );
|
wfDebug( __METHOD__ . ': Writes done: ' . DatabaseBase::generalizeSQL( $sql ) . "\n" );
|
||||||
$this->mDoneWrites = true;
|
$this->mDoneWrites = microtime( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add a comment for easy SHOW PROCESSLIST interpretation
|
# Add a comment for easy SHOW PROCESSLIST interpretation
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ class RunJobs extends Maintenance {
|
||||||
|
|
||||||
$jobsRun = 0; // counter
|
$jobsRun = 0; // counter
|
||||||
$flags = JobQueueGroup::USE_CACHE;
|
$flags = JobQueueGroup::USE_CACHE;
|
||||||
$lastTime = time(); // time since last slave check
|
$lastTime = microtime( true ); // time since last slave check
|
||||||
do {
|
do {
|
||||||
$backoffs = array_filter( $backoffs, $backoffExpireFunc );
|
$backoffs = array_filter( $backoffs, $backoffExpireFunc );
|
||||||
$blacklist = $noThrottle ? array() : array_keys( $backoffs );
|
$blacklist = $noThrottle ? array() : array_keys( $backoffs );
|
||||||
|
|
@ -146,10 +146,10 @@ class RunJobs extends Maintenance {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't let any of the main DB slaves get backed up
|
// Don't let any of the main DB slaves get backed up
|
||||||
$timePassed = time() - $lastTime;
|
$timePassed = microtime( true ) - $lastTime;
|
||||||
if ( $timePassed >= 5 || $timePassed < 0 ) {
|
if ( $timePassed >= 5 || $timePassed < 0 ) {
|
||||||
wfWaitForSlaves();
|
wfWaitForSlaves( $lastTime );
|
||||||
$lastTime = time();
|
$lastTime = microtime( true );
|
||||||
}
|
}
|
||||||
// Don't let any queue slaves/backups fall behind
|
// Don't let any queue slaves/backups fall behind
|
||||||
if ( $jobsRun > 0 && ( $jobsRun % 100 ) == 0 ) {
|
if ( $jobsRun > 0 && ( $jobsRun % 100 ) == 0 ) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue