return false;
}
- $found = $this->getSlaveDB()->selectField(
- 'job', '1', array( 'job_cmd' => $this->type ), __METHOD__
+ $found = $this->getSlaveDB()->selectField( // unclaimed job
+ 'job', '1', array( 'job_cmd' => $this->type, 'job_token' => '' ), __METHOD__
);
-
$wgMemc->add( $key, $found ? 'false' : 'true', self::CACHE_TTL );
+
+ return !$found;
}
/**
* @see JobQueue::doBatchPush()
+ * @param array $jobs
+ * @param $flags
+ * @throws DBError|Exception
* @return bool
*/
protected function doBatchPush( array $jobs, $flags ) {
}
$job = Job::factory( $row->job_cmd, $title,
self::extractBlob( $row->job_params ), $row->job_id );
+ $job->id = $row->job_id; // XXX: work around broken subclasses
// Flag this job as an old duplicate based on its "root" job...
if ( $this->isRootJobOldDuplicate( $job ) ) {
$job = DuplicateJob::newFromJob( $job ); // convert to a no-op
*/
protected function claimRandom( $uuid, $rand, $gte ) {
$dbw = $this->getMasterDB();
- $dir = $gte ? 'ASC' : 'DESC';
$ineq = $gte ? '>=' : '<=';
$row = false; // the row acquired
'job_cmd' => $this->type,
'job_token' => '',
"job_random {$ineq} {$dbw->addQuotes( $rand )}" ),
- __METHOD__,
- array( 'ORDER BY' => "job_random {$dir}" )
+ __METHOD__
+ // Bug 42614: "ORDER BY job_random" causes slowness on mysql for some reason
);
if ( $row ) { // claim the job
$dbw->update( 'job', // update by PK
/**
* @see JobQueue::doAck()
+ * @param Job $job
+ * @throws MWException
* @return Job|bool
*/
protected function doAck( Job $job ) {
+ if ( !$job->getId() ) {
+ throw new MWException( "Job of type '{$job->getType()}' has no ID." );
+ }
+
$dbw = $this->getMasterDB();
$dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
// Delete a row with a single DELETE without holding row locks over RTTs...
- $dbw->delete( 'job', array( 'job_cmd' => $this->type, 'job_id' => $job->getId() ) );
+ $dbw->delete( 'job',
+ array( 'job_cmd' => $this->type, 'job_id' => $job->getId() ), __METHOD__ );
return true;
}
/**
* @see JobQueue::doDeduplicateRootJob()
+ * @param Job $job
+ * @throws MWException
* @return bool
*/
protected function doDeduplicateRootJob( Job $job ) {
$key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
// Callers should call batchInsert() and then this function so that if the insert
// fails, the de-duplication registration will be aborted. Since the insert is
- // deferred till "transaction idle", do that same here, so that the ordering is
+ // deferred till "transaction idle", do the same here, so that the ordering is
// maintained. Having only the de-duplication registration succeed would cause
// jobs to become no-ops without any actual jobs that made them redundant.
$this->getMasterDB()->onTransactionIdle( function() use ( $params, $key ) {