12 function __construct( $name =
null, array $data = [], $dataName =
'' ) {
13 parent::__construct( $name, $data, $dataName );
15 $this->tablesUsed[] =
'job';
22 if ( $this->
getCliArg(
'use-jobqueue' ) ) {
23 $name = $this->
getCliArg(
'use-jobqueue' );
25 throw new MWException(
"No \$wgJobTypeConf entry for '$name'." );
29 $baseConfig = [
'class' =>
'JobQueueDB' ];
31 $baseConfig[
'type'] =
'null';
34 'queueRand' => [
'order' =>
'random',
'claimTTL' => 0 ],
35 'queueRandTTL' => [
'order' =>
'random',
'claimTTL' => 10 ],
36 'queueTimestamp' => [
'order' =>
'timestamp',
'claimTTL' => 0 ],
37 'queueTimestampTTL' => [
'order' =>
'timestamp',
'claimTTL' => 10 ],
38 'queueFifo' => [
'order' =>
'fifo',
'claimTTL' => 0 ],
39 'queueFifoTTL' => [
'order' =>
'fifo',
'claimTTL' => 10 ],
41 foreach ( $variants as $q => $settings ) {
55 'queueRand',
'queueRandTTL',
'queueTimestamp',
'queueTimestampTTL',
56 'queueFifo',
'queueFifoTTL'
73 $this->markTestSkipped( $desc );
75 $this->assertEquals(
wfWikiID(),
$queue->getWiki(),
"Proper wiki ID ($desc)" );
85 $this->markTestSkipped( $desc );
87 $this->assertEquals(
'null',
$queue->getType(),
"Proper job type ($desc)" );
97 $this->markTestSkipped( $desc );
100 $this->assertTrue(
$queue->isEmpty(),
"Queue is empty ($desc)" );
103 $this->assertEquals( 0,
$queue->getSize(),
"Queue is empty ($desc)" );
104 $this->assertEquals( 0,
$queue->getAcquiredCount(),
"Queue is empty ($desc)" );
106 $this->assertNull(
$queue->push( $this->newJob() ),
"Push worked ($desc)" );
107 $this->assertNull(
$queue->batchPush( [ $this->newJob() ] ),
"Push worked ($desc)" );
109 $this->assertFalse(
$queue->isEmpty(),
"Queue is not empty ($desc)" );
112 $this->assertEquals( 2,
$queue->getSize(),
"Queue size is correct ($desc)" );
113 $this->assertEquals( 0,
$queue->getAcquiredCount(),
"No jobs active ($desc)" );
114 $jobs = iterator_to_array(
$queue->getAllQueuedJobs() );
115 $this->assertEquals( 2, count( $jobs ),
"Queue iterator size is correct ($desc)" );
118 $this->assertFalse(
$queue->isEmpty(),
"Queue is not empty ($desc)" );
121 $this->assertEquals( 1,
$queue->getSize(),
"Queue size is correct ($desc)" );
125 $this->assertEquals( 1,
$queue->getAcquiredCount(),
"Active job count ($desc)" );
129 $this->assertTrue(
$queue->isEmpty(),
"Queue is empty ($desc)" );
130 $this->assertEquals( 0,
$queue->getSize(),
"Queue is empty ($desc)" );
134 $this->assertEquals( 2,
$queue->getAcquiredCount(),
"Active job count ($desc)" );
141 $this->assertEquals( 1,
$queue->getAcquiredCount(),
"Active job count ($desc)" );
147 $this->assertEquals( 0,
$queue->getAcquiredCount(),
"Active job count ($desc)" );
149 $this->assertNull(
$queue->batchPush( [ $this->newJob(), $this->newJob() ] ),
150 "Push worked ($desc)" );
151 $this->assertFalse(
$queue->isEmpty(),
"Queue is not empty ($desc)" );
155 $this->assertTrue(
$queue->isEmpty(),
"Queue is empty ($desc)" );
156 $this->assertEquals( 0,
$queue->getSize(),
"Queue is empty ($desc)" );
166 $this->markTestSkipped( $desc );
169 $this->assertTrue(
$queue->isEmpty(),
"Queue is empty ($desc)" );
172 $this->assertEquals( 0,
$queue->getSize(),
"Queue is empty ($desc)" );
173 $this->assertEquals( 0,
$queue->getAcquiredCount(),
"Queue is empty ($desc)" );
177 [ $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() ]
179 "Push worked ($desc)" );
181 $this->assertFalse(
$queue->isEmpty(),
"Queue is not empty ($desc)" );
184 $this->assertEquals( 1,
$queue->getSize(),
"Queue size is correct ($desc)" );
185 $this->assertEquals( 0,
$queue->getAcquiredCount(),
"No jobs active ($desc)" );
189 [ $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() ]
191 "Push worked ($desc)"
194 $this->assertFalse(
$queue->isEmpty(),
"Queue is not empty ($desc)" );
197 $this->assertEquals( 1,
$queue->getSize(),
"Queue size is correct ($desc)" );
198 $this->assertEquals( 0,
$queue->getAcquiredCount(),
"No jobs active ($desc)" );
201 $this->assertTrue(
$queue->isEmpty(),
"Queue is empty ($desc)" );
204 $this->assertEquals( 0,
$queue->getSize(),
"Queue is empty ($desc)" );
206 $this->assertEquals( 1,
$queue->getAcquiredCount(),
"Active job count ($desc)" );
212 $this->assertEquals( 0,
$queue->getAcquiredCount(),
"Active job count ($desc)" );
222 $this->markTestSkipped( $desc );
245 $this->markTestSkipped( $desc );
248 $this->assertTrue(
$queue->isEmpty(),
"Queue is empty ($desc)" );
251 $this->assertEquals( 0,
$queue->getSize(),
"Queue is empty ($desc)" );
252 $this->assertEquals( 0,
$queue->getAcquiredCount(),
"Queue is empty ($desc)" );
256 for ( $i = 0; $i < 5; ++$i ) {
257 $this->assertNull(
$queue->push( $this->newJob( 0, $root1 ) ),
"Push worked ($desc)" );
259 $queue->deduplicateRootJob( $this->
newJob( 0, $root1 ) );
262 # Add a second to UNIX epoch and format back to TS_MW
263 $root2_ts = strtotime( $root2[
'rootJobTimestamp'] );
265 $root2[
'rootJobTimestamp'] =
wfTimestamp( TS_MW, $root2_ts );
267 $this->assertNotEquals( $root1[
'rootJobTimestamp'], $root2[
'rootJobTimestamp'],
268 "Root job signatures have different timestamps." );
269 for ( $i = 0; $i < 5; ++$i ) {
270 $this->assertNull(
$queue->push( $this->newJob( 0, $root2 ) ),
"Push worked ($desc)" );
272 $queue->deduplicateRootJob( $this->
newJob( 0, $root2 ) );
274 $this->assertFalse(
$queue->isEmpty(),
"Queue is not empty ($desc)" );
277 $this->assertEquals( 10,
$queue->getSize(),
"Queue size is correct ($desc)" );
278 $this->assertEquals( 0,
$queue->getAcquiredCount(),
"No jobs active ($desc)" );
293 $this->assertEquals( 10, count( $jobs ),
"Correct number of jobs popped ($desc)" );
294 $this->assertEquals( 5, $dupcount,
"Correct number of duplicate jobs popped ($desc)" );
304 $this->markTestSkipped( $desc );
307 $this->assertTrue(
$queue->isEmpty(),
"Queue is empty ($desc)" );
310 $this->assertEquals( 0,
$queue->getSize(),
"Queue is empty ($desc)" );
311 $this->assertEquals( 0,
$queue->getAcquiredCount(),
"Queue is empty ($desc)" );
313 for ( $i = 0; $i < 10; ++$i ) {
314 $this->assertNull(
$queue->push( $this->newJob( $i ) ),
"Push worked ($desc)" );
317 for ( $i = 0; $i < 10; ++$i ) {
319 $this->assertTrue(
$job instanceof
Job,
"Jobs popped from queue ($desc)" );
321 $this->assertEquals( $i,
$params[
'i'],
"Job popped from queue is FIFO ($desc)" );
325 $this->assertFalse(
$queue->pop(),
"Queue is not empty ($desc)" );
328 $this->assertEquals( 0,
$queue->getSize(),
"Queue is empty ($desc)" );
329 $this->assertEquals( 0,
$queue->getAcquiredCount(),
"No jobs active ($desc)" );
337 if ( !
$queue || !method_exists(
$queue,
'getServerQueuesWithJobs' ) ) {
338 $this->markTestSkipped();
341 $this->assertNotContains(
343 $queue->getServerQueuesWithJobs(),
344 "Null queue not in listing"
349 $this->assertContains(
351 $queue->getServerQueuesWithJobs(),
352 "Null queue in listing"
358 [
'queueRand',
false,
'Random queue without ack()' ],
359 [
'queueRandTTL',
true,
'Random queue with ack()' ],
360 [
'queueTimestamp',
false,
'Time ordered queue without ack()' ],
361 [
'queueTimestampTTL',
true,
'Time ordered queue with ack()' ],
362 [
'queueFifo',
false,
'FIFO ordered queue without ack()' ],
363 [
'queueFifoTTL',
true,
'FIFO ordered queue with ack()' ]
369 [
'queueFifo',
false,
'Ordered queue without ack()' ],
370 [
'queueFifoTTL',
true,
'Ordered queue with ack()' ]
374 function newJob( $i = 0, $rootJob = [] ) {
375 return new NullJob( Title::newMainPage(),
376 [
'lives' => 0,
'usleep' => 0,
'removeDuplicates' => 0,
'i' => $i ] + $rootJob );
380 return new NullJob( Title::newMainPage(),
381 [
'lives' => 0,
'usleep' => 0,
'removeDuplicates' => 1,
'i' => $i ] + $rootJob );
$wgJobTypeConf
Map of job types to configuration arrays.
wfRandomString( $length=32)
Get a random string containing a number of pseudo-random hex characters.
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
wfWikiID()
Get an ASCII string identifying this wiki This is used as a prefix in memcached keys.
No-op job that does nothing.
JobQueue medium Database.
testBasicOperations( $queue, $recycles, $desc)
provider_queueLists JobQueue
testJobOrder( $queue, $recycles, $desc)
provider_fifoQueueLists JobQueue
testRootDeduplication( $queue, $recycles, $desc)
provider_queueLists JobQueue
static provider_queueLists()
__construct( $name=null, array $data=[], $dataName='')
static provider_fifoQueueLists()
testBasicDeduplication( $queue, $recycles, $desc)
provider_queueLists JobQueue
testDeduplicationWhileClaimed( $queue, $recycles, $desc)
provider_queueLists JobQueue
newJob( $i=0, $rootJob=[])
testQueueAggregateTable()
JobQueue.
testGetWiki( $queue, $recycles, $desc)
provider_queueLists JobQueue::getWiki
testGetType( $queue, $recycles, $desc)
provider_queueLists JobQueue::getType
newDedupedJob( $i=0, $rootJob=[])
static factory(array $params)
Get a job queue object of the specified type.
Class to both describe a background job and handle jobs.
static newRootJobParams( $key)
Get "root job" parameters for a task.
Degenerate job that does nothing, but can optionally replace itself in the queue and/or sleep for a b...
Allows to change the fields on the form that will be generated $name
returning false will NOT prevent logging $e
if(count( $args)< 1) $job