X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Fjobqueue%2FJobQueue.php;h=020a68472852ee46c35448f1c30d529be1a04ddc;hp=5b7193856d9dc7308591d6e6201e42f4a9a1ffc4;hb=f43fa6f4f0e2cb60b8543daad661b48a3e0653a9;hpb=734ca2b4d2a1246fb0ea1e54b861ab423ab5e257 diff --git a/includes/jobqueue/JobQueue.php b/includes/jobqueue/JobQueue.php index 5b7193856d..020a684728 100644 --- a/includes/jobqueue/JobQueue.php +++ b/includes/jobqueue/JobQueue.php @@ -31,18 +31,16 @@ abstract class JobQueue { /** @var string Wiki ID */ protected $wiki; - /** @var string Job type */ protected $type; - /** @var string Job priority for pop() */ protected $order; - /** @var int Time to live in seconds */ protected $claimTTL; - /** @var int Maximum number of times to try a job */ protected $maxTries; + /** @var string|bool Read only rationale (or false if r/w) */ + protected $readOnlyReason; /** @var BagOStuff */ protected $dupCache; @@ -74,6 +72,9 @@ abstract class JobQueue { $this->aggr = isset( $params['aggregator'] ) ? $params['aggregator'] : new JobQueueAggregatorNull( [] ); + $this->readOnlyReason = isset( $params['readOnlyReason'] ) + ? $params['readOnlyReason'] + : false; } /** @@ -96,6 +97,7 @@ abstract class JobQueue { * but not acknowledged as completed after this many seconds. Recycling * of jobs simply means re-inserting them into the queue. Jobs can be * attempted up to three times before being discarded. + * - readOnlyReason : Set this to a string to make the queue read-only. * * Queue classes should throw an exception if they do not support the options given. * @@ -168,6 +170,14 @@ abstract class JobQueue { return $this->supportsDelayedJobs(); } + /** + * @return string|bool Read-only rational or false if r/w + * @since 1.27 + */ + public function getReadOnlyReason() { + return $this->readOnlyReason; + } + /** * Quickly check if the queue has no available (unacquired, non-delayed) jobs. * Queue classes should use caching if they are any slower without memcached. @@ -307,6 +317,8 @@ abstract class JobQueue { * @throws MWException */ final public function batchPush( array $jobs, $flags = 0 ) { + $this->assertNotReadOnly(); + if ( !count( $jobs ) ) { return; // nothing to do } @@ -349,6 +361,7 @@ abstract class JobQueue { final public function pop() { global $wgJobClasses; + $this->assertNotReadOnly(); if ( $this->wiki !== wfWikiID() ) { throw new MWException( "Cannot pop '{$this->type}' job off foreign wiki queue." ); } elseif ( !isset( $wgJobClasses[$this->type] ) ) { @@ -392,9 +405,11 @@ abstract class JobQueue { * @throws MWException */ final public function ack( Job $job ) { + $this->assertNotReadOnly(); if ( $job->getType() !== $this->type ) { throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." ); } + $this->doAck( $job ); } @@ -436,12 +451,12 @@ abstract class JobQueue { * @return bool */ final public function deduplicateRootJob( IJobSpecification $job ) { + $this->assertNotReadOnly(); if ( $job->getType() !== $this->type ) { throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." ); } - $ok = $this->doDeduplicateRootJob( $job ); - return $ok; + return $this->doDeduplicateRootJob( $job ); } /** @@ -524,6 +539,8 @@ abstract class JobQueue { * @return void */ final public function delete() { + $this->assertNotReadOnly(); + $this->doDelete(); } @@ -536,7 +553,7 @@ abstract class JobQueue { } /** - * Wait for any slaves or backup servers to catch up. + * Wait for any replica DBs or backup servers to catch up. * * This does nothing for certain queue classes. * @@ -672,6 +689,15 @@ abstract class JobQueue { return null; // not supported } + /** + * @throws JobQueueReadOnlyError + */ + protected function assertNotReadOnly() { + if ( $this->readOnlyReason !== false ) { + throw new JobQueueReadOnlyError( "Job queue is read-only: {$this->readOnlyReason}" ); + } + } + /** * Call wfIncrStats() for the queue overall and for the queue type * @@ -699,3 +725,7 @@ class JobQueueError extends MWException { class JobQueueConnectionError extends JobQueueError { } + +class JobQueueReadOnlyError extends JobQueueError { + +}