From 005f53fe15f46dd228917077730e56ca537534f0 Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Thu, 10 Mar 2011 11:39:23 +0000 Subject: [PATCH] Fix duplicate removal. Was completely broken, with a "job_id IS NULL" condition in the delete query. Added a COMMIT to pop_type(). --- includes/job/JobQueue.php | 40 +++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/includes/job/JobQueue.php b/includes/job/JobQueue.php index 949dfe542d..517b94fa5f 100644 --- a/includes/job/JobQueue.php +++ b/includes/job/JobQueue.php @@ -68,6 +68,7 @@ abstract class Job { /* Ensure we "own" this row */ $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ ); $affected = $dbw->affectedRows(); + $dbw->commit(); if ( $affected == 0 ) { wfProfileOut( __METHOD__ ); @@ -81,13 +82,7 @@ abstract class Job { $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ), $row->job_id ); - $dbw->delete( 'job', $job->insertFields(), __METHOD__ ); - $affected = $dbw->affectedRows(); - $dbw->commit(); - - if ( $affected ) { - wfIncrStats( 'job-dup-delete', $affected ); - } + $job->removeDuplicates(); wfProfileOut( __METHOD__ ); return $job; @@ -176,15 +171,7 @@ abstract class Job { $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ), $row->job_id ); // Remove any duplicates it may have later in the queue - // Deadlock prone section - $dbw->begin(); - $dbw->delete( 'job', $job->insertFields(), __METHOD__ ); - $affected = $dbw->affectedRows(); - $dbw->commit(); - - if ( $affected ) { - wfIncrStats( 'job-dup-delete', $affected ); - } + $job->removeDuplicates(); wfProfileOut( __METHOD__ ); return $job; @@ -308,6 +295,27 @@ abstract class Job { ); } + /** + * Remove jobs in the job queue which are duplicates of this job. + * This is deadlock-prone and so starts its own transaction. + */ + function removeDuplicates() { + if ( !$this->removeDuplicates ) { + return; + } + + $fields = $this->insertFields(); + unset( $fields['job_id'] ); + $dbw = wfGetDB( DB_MASTER ); + $dbw->begin(); + $dbw->delete( 'job', $fields, __METHOD__ ); + $affected = $dbw->affectedRows(); + $dbw->commit(); + if ( $affected ) { + wfIncrStats( 'job-dup-delete', $affected ); + } + } + function toString() { $paramString = ''; if ( $this->params ) { -- 2.20.1