'class' => 'JobQueueAggregatorNull'
];
+/**
+ * Whether to include the number of jobs that are queued
+ * for the API's maxlag parameter.
+ * The total number of jobs will be divided by this to get an
+ * estimated second of maxlag. Typically bots backoff at maxlag=5,
+ * so setting this to the max number of jobs that should be in your
+ * queue divided by 5 should have the effect of stopping bots once
+ * that limit is hit.
+ *
+ * @since 1.29
+ */
+$wgJobQueueIncludeInMaxLagFactor = false;
+
/**
* Additional functions to be performed with updateSpecialPages.
* Expensive Querypages are already updated.
return $module;
}
+ /**
+ * @return array
+ */
+ private function getMaxLag() {
+ $dbLag = MediaWikiServices::getInstance()->getDBLoadBalancer()->getMaxLag();
+ $lagInfo = [
+ 'host' => $dbLag[0],
+ 'lag' => $dbLag[1],
+ 'type' => 'db'
+ ];
+
+ $jobQueueLagFactor = $this->getConfig()->get( 'JobQueueIncludeInMaxLagFactor' );
+ if ( $jobQueueLagFactor ) {
+ // Turn total number of jobs into seconds by using the configured value
+ $totalJobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
+ $jobQueueLag = $totalJobs / (float)$jobQueueLagFactor;
+ if ( $jobQueueLag > $lagInfo['lag'] ) {
+ $lagInfo = [
+ 'host' => wfHostname(), // XXX: Is there a better value that could be used?
+ 'lag' => $jobQueueLag,
+ 'type' => 'jobqueue',
+ 'jobs' => $totalJobs,
+ ];
+ }
+ }
+
+ return $lagInfo;
+ }
+
/**
* Check the max lag if necessary
* @param ApiBase $module Api module being used
protected function checkMaxLag( $module, $params ) {
if ( $module->shouldCheckMaxlag() && isset( $params['maxlag'] ) ) {
$maxLag = $params['maxlag'];
- list( $host, $lag ) = wfGetLB()->getMaxLag();
- if ( $lag > $maxLag ) {
+ $lagInfo = $this->getMaxLag();
+ if ( $lagInfo['lag'] > $maxLag ) {
$response = $this->getRequest()->response();
$response->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
- $response->header( 'X-Database-Lag: ' . intval( $lag ) );
+ $response->header( 'X-Database-Lag: ' . intval( $lagInfo['lag'] ) );
if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
- $this->dieWithError( [ 'apierror-maxlag', $lag, $host ] );
+ $this->dieWithError(
+ [ 'apierror-maxlag', $lagInfo['lag'], $lagInfo['host'] ],
+ 'maxlag',
+ $lagInfo
+ );
}
- $this->dieWithError( [ 'apierror-maxlag-generic', $lag ], 'maxlag' );
+ $this->dieWithError( [ 'apierror-maxlag-generic', $lagInfo['lag'] ], 'maxlag', $lagInfo );
}
}