* @since 1.24
*/
class JobRunner implements LoggerAwareInterface {
+ /** @var Config */
+ protected $config;
/** @var callable|null Debug output handler */
protected $debug;
$logger = LoggerFactory::getInstance( 'runJobs' );
}
$this->setLogger( $logger );
+ $this->config = MediaWikiServices::getInstance()->getMainConfig();
}
/**
* @return array Summary response that can easily be JSON serialized
*/
public function run( array $options ) {
- global $wgJobClasses, $wgTrxProfilerLimits;
+ $jobClasses = $this->config->get( 'JobClasses' );
+ $profilerLimits = $this->config->get( 'TrxProfilerLimits' );
$response = [ 'jobs' => [], 'reached' => 'none-ready' ];
$noThrottle = isset( $options['throttle'] ) && !$options['throttle'];
// Bail if job type is invalid
- if ( $type !== false && !isset( $wgJobClasses[$type] ) ) {
+ if ( $type !== false && !isset( $jobClasses[$type] ) ) {
$response['reached'] = 'none-possible';
return $response;
}
// Catch huge single updates that lead to replica DB lag
$trxProfiler = Profiler::instance()->getTransactionProfiler();
$trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
- $trxProfiler->setExpectations( $wgTrxProfilerLimits['JobRunner'], __METHOD__ );
+ $trxProfiler->setExpectations( $profilerLimits['JobRunner'], __METHOD__ );
// Some jobs types should not run until a certain timestamp
$backoffs = []; // map of (type => UNIX expiry)
* @see $wgJobBackoffThrottling
*/
private function getBackoffTimeToWait( Job $job ) {
- global $wgJobBackoffThrottling;
+ $throttling = $this->config->get( 'JobBackoffThrottling' );
- if ( !isset( $wgJobBackoffThrottling[$job->getType()] ) ||
- $job instanceof DuplicateJob // no work was done
- ) {
+ if ( !isset( $throttling[$job->getType()] ) || $job instanceof DuplicateJob ) {
return 0; // not throttled
}
- $itemsPerSecond = $wgJobBackoffThrottling[$job->getType()];
+ $itemsPerSecond = $throttling[$job->getType()];
if ( $itemsPerSecond <= 0 ) {
return 0; // not throttled
}
* @throws DBError
*/
private function commitMasterChanges( LBFactory $lbFactory, Job $job, $fnameTrxOwner ) {
- global $wgJobSerialCommitThreshold;
+ $syncThreshold = $this->config->get( 'JobSerialCommitThreshold' );
$time = false;
$lb = $lbFactory->getMainLB( wfWikiID() );
- if ( $wgJobSerialCommitThreshold !== false && $lb->getServerCount() > 1 ) {
+ if ( $syncThreshold !== false && $lb->getServerCount() > 1 ) {
// Generally, there is one master connection to the local DB
$dbwSerial = $lb->getAnyOpenConnection( $lb->getWriterIndex() );
// We need natively blocking fast locks
if ( $dbwSerial && $dbwSerial->namedLocksEnqueue() ) {
$time = $dbwSerial->pendingWriteQueryDuration( $dbwSerial::ESTIMATE_DB_APPLY );
- if ( $time < $wgJobSerialCommitThreshold ) {
+ if ( $time < $syncThreshold ) {
$dbwSerial = false;
}
} else {
}
if ( !$dbwSerial ) {
- $lbFactory->commitMasterChanges( $fnameTrxOwner );
+ $lbFactory->commitMasterChanges(
+ $fnameTrxOwner,
+ // Abort if any transaction was too big
+ [ 'maxWriteDuration' => $this->config->get( 'MaxJobDBWriteDuration' ) ]
+ );
+
return;
}
}
// Actually commit the DB master changes
- $lbFactory->commitMasterChanges( $fnameTrxOwner );
+ $lbFactory->commitMasterChanges(
+ $fnameTrxOwner,
+ // Abort if any transaction was too big
+ [ 'maxWriteDuration' => $this->config->get( 'MaxJobDBWriteDuration' ) ]
+ );
ScopedCallback::consume( $unlocker );
}
}