Automatically deduplicate root jobs on insertion
* This makes lazyPush() simple to use in more cases Change-Id: I22e74485eaf3120e5669c5ee55dc7ab7310d7300
This commit is contained in:
parent
c3f5ee0973
commit
e2826974c6
5 changed files with 36 additions and 2 deletions
|
|
@ -56,7 +56,6 @@ class HTMLCacheUpdate implements DeferrableUpdate {
|
|||
$count = $this->mTitle->getBacklinkCache()->getNumLinks( $this->mTable, 100 );
|
||||
if ( $count >= 100 ) { // many backlinks
|
||||
JobQueueGroup::singleton()->lazyPush( $job );
|
||||
JobQueueGroup::singleton()->deduplicateRootJob( $job );
|
||||
} else { // few backlinks ($count might be off even if 0)
|
||||
$dbw = wfGetDB( DB_MASTER );
|
||||
$dbw->onTransactionIdle( function () use ( $job ) {
|
||||
|
|
|
|||
|
|
@ -267,7 +267,6 @@ class LinksUpdate extends SqlDataUpdate {
|
|||
);
|
||||
|
||||
JobQueueGroup::singleton()->push( $job );
|
||||
JobQueueGroup::singleton()->deduplicateRootJob( $job );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -196,15 +196,27 @@ abstract class Job implements IJobSpecification {
|
|||
}
|
||||
|
||||
/**
|
||||
* Get "root job" parameters for a task
|
||||
*
|
||||
* This is used to no-op redundant jobs, including child jobs of jobs,
|
||||
* as long as the children inherit the root job parameters. When a job
|
||||
* with root job parameters and "rootJobIsSelf" set is pushed, the
|
||||
* deduplicateRootJob() method is automatically called on it. If the
|
||||
* root job is only virtual and not actually pushed (e.g. the sub-jobs
|
||||
* are inserted directly), then call deduplicateRootJob() directly.
|
||||
*
|
||||
* @see JobQueue::deduplicateRootJob()
|
||||
*
|
||||
* @param string $key A key that identifies the task
|
||||
* @return array Map of:
|
||||
* - rootJobIsSelf : true
|
||||
* - rootJobSignature : hash (e.g. SHA1) that identifies the task
|
||||
* - rootJobTimestamp : TS_MW timestamp of this instance of the task
|
||||
* @since 1.21
|
||||
*/
|
||||
public static function newRootJobParams( $key ) {
|
||||
return array(
|
||||
'rootJobIsSelf' => true,
|
||||
'rootJobSignature' => sha1( $key ),
|
||||
'rootJobTimestamp' => wfTimestampNow()
|
||||
);
|
||||
|
|
@ -236,6 +248,14 @@ abstract class Job implements IJobSpecification {
|
|||
&& isset( $this->params['rootJobTimestamp'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* @see JobQueue::deduplicateRootJob()
|
||||
* @return bool Whether this is job is a root job
|
||||
*/
|
||||
public function isRootJob() {
|
||||
return $this->hasRootJobParams() && !empty( $this->params['rootJobIsSelf'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert a single job into the queue.
|
||||
* @return bool True on success
|
||||
|
|
|
|||
|
|
@ -323,6 +323,12 @@ abstract class JobQueue {
|
|||
|
||||
$this->doBatchPush( $jobs, $flags );
|
||||
$this->aggr->notifyQueueNonEmpty( $this->wiki, $this->type );
|
||||
|
||||
foreach ( $jobs as $job ) {
|
||||
if ( $job->isRootJob() ) {
|
||||
$this->deduplicateRootJob( $job );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -72,6 +72,12 @@ interface IJobSpecification {
|
|||
*/
|
||||
public function hasRootJobParams();
|
||||
|
||||
/**
|
||||
* @see JobQueue::deduplicateRootJob()
|
||||
* @return bool Whether this is job is a root job
|
||||
*/
|
||||
public function isRootJob();
|
||||
|
||||
/**
|
||||
* @return Title Descriptive title (this can simply be informative)
|
||||
*/
|
||||
|
|
@ -195,6 +201,10 @@ class JobSpecification implements IJobSpecification {
|
|||
&& isset( $this->params['rootJobTimestamp'] );
|
||||
}
|
||||
|
||||
public function isRootJob() {
|
||||
return $this->hasRootJobParams() && !empty( $this->params['rootJobIsSelf'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array Field/value map that can immediately be serialized
|
||||
* @since 1.25
|
||||
|
|
|
|||
Loading…
Reference in a new issue