private function getBackoffTimeToWait( Job $job ) {
global $wgJobBackoffThrottling;
- if ( !isset( $wgJobBackoffThrottling[$job->getType()] ) ) {
+ if ( !isset( $wgJobBackoffThrottling[$job->getType()] ) ||
+ $job instanceof DuplicateJob // no work was done
+ ) {
return 0; // not throttled
}
+
$itemsPerSecond = $wgJobBackoffThrottling[$job->getType()];
if ( $itemsPerSecond <= 0 ) {
return 0; // not throttled
$seconds = 0;
if ( $job->workItemCount() > 0 ) {
- $seconds = floor( $job->workItemCount() / $itemsPerSecond );
- $remainder = $job->workItemCount() % $itemsPerSecond;
- $seconds += ( mt_rand( 1, $itemsPerSecond ) <= $remainder ) ? 1 : 0;
+ $exactSeconds = $job->workItemCount() / $itemsPerSecond;
+ // use randomized rounding
+ $seconds = floor( $exactSeconds );
+ $remainder = $exactSeconds - $seconds;
+ $seconds += ( mt_rand() / mt_getrandmax() < $remainder ) ? 1 : 0;
}
return (int)$seconds;