Merge "Automatically deduplicate root jobs on insertion"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 5 Jun 2015 20:15:23 +0000 (20:15 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 5 Jun 2015 20:15:23 +0000 (20:15 +0000)
includes/deferred/HTMLCacheUpdate.php
includes/deferred/LinksUpdate.php
includes/jobqueue/Job.php
includes/jobqueue/JobQueue.php
includes/jobqueue/JobSpecification.php

index 20e4a4c..a480aec 100644 (file)
@@ -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 ) {
index e4f00e7..eeadd16 100644 (file)
@@ -267,7 +267,6 @@ class LinksUpdate extends SqlDataUpdate {
                        );
 
                        JobQueueGroup::singleton()->push( $job );
-                       JobQueueGroup::singleton()->deduplicateRootJob( $job );
                }
        }
 
index b971bd5..f7ef8a9 100644 (file)
@@ -206,15 +206,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()
                );
@@ -246,6 +258,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
index 1a68489..013cc61 100644 (file)
@@ -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 );
+                       }
+               }
        }
 
        /**
index ecace3a..d59c09b 100644 (file)
@@ -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