X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fjobqueue%2FJobRunner.php;h=baff288e853c0ec7ae585c45878846ff37a0b6c0;hb=c584722cc2e3d33edae58d46c2149063b3fc6d72;hp=990f112a60c47b67521a99d770988780dce91420;hpb=1674c8413a4ec5065040408a8cbdb948c74bf6fa;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/jobqueue/JobRunner.php b/includes/jobqueue/JobRunner.php index 990f112a60..baff288e85 100644 --- a/includes/jobqueue/JobRunner.php +++ b/includes/jobqueue/JobRunner.php @@ -27,6 +27,7 @@ use Liuggio\StatsdClient\Factory\StatsdDataFactory; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerInterface; use Wikimedia\ScopedCallback; +use Wikimedia\Rdbms\LBFactory; /** * Job queue runner utility methods @@ -46,6 +47,7 @@ class JobRunner implements LoggerAwareInterface { const MAX_ALLOWED_LAG = 3; // abort if more than this much DB lag is present const LAG_CHECK_PERIOD = 1.0; // check replica DB lag this many seconds const ERROR_BACKOFF_TTL = 1; // seconds to back off a queue due to errors + const READONLY_BACKOFF_TTL = 30; // seconds to back off a queue due to read-only errors /** * @param callable $debug Optional debug output handler @@ -190,7 +192,7 @@ class JobRunner implements LoggerAwareInterface { // Back off of certain jobs for a while (for throttling and for errors) if ( $info['status'] === false && mt_rand( 0, 49 ) == 0 ) { - $ttw = max( $ttw, self::ERROR_BACKOFF_TTL ); // too many errors + $ttw = max( $ttw, $this->getErrorBackoffTTL( $info['error'] ) ); $backoffDeltas[$jType] = isset( $backoffDeltas[$jType] ) ? $backoffDeltas[$jType] + $ttw : $ttw; @@ -253,6 +255,16 @@ class JobRunner implements LoggerAwareInterface { return $response; } + /** + * @param string $error + * @return int TTL in seconds + */ + private function getErrorBackoffTTL( $error ) { + return strpos( $error, 'DBReadOnlyError' ) !== false + ? self::READONLY_BACKOFF_TTL + : self::ERROR_BACKOFF_TTL; + } + /** * @param Job $job * @param LBFactory $lbFactory