From: Aaron Schulz Date: Thu, 19 Jan 2017 00:02:16 +0000 (-0800) Subject: Add small script for common job queue admin tasks X-Git-Tag: 1.31.0-rc.0~4269^2 X-Git-Url: https://git.cyclocoop.org/%27.%24link.%27?a=commitdiff_plain;h=b38e4461db0bdbfe6ddcdcc7bd774b00f92c8460;p=lhc%2Fweb%2Fwiklou.git Add small script for common job queue admin tasks This can handle dropping queued and re-enqueueing abandoned jobs. Also use the DB cache table to avoid re-enqueuing duplicate jobs if this has to get used several times for a queue during a week. Change-Id: Ib56cf57e56f03ce6f1c4b52e3e36f228413c1056 --- diff --git a/autoload.php b/autoload.php index 5d0ca0d2d5..7ed08dfaee 100644 --- a/autoload.php +++ b/autoload.php @@ -810,6 +810,7 @@ $wgAutoloadLocalClasses = [ 'MaintenanceFormatInstallDoc' => __DIR__ . '/maintenance/formatInstallDoc.php', 'MakeTestEdits' => __DIR__ . '/maintenance/makeTestEdits.php', 'MalformedTitleException' => __DIR__ . '/includes/title/MalformedTitleException.php', + 'ManageJobs' => __DIR__ . '/maintenance/manageJobs.php', 'ManualLogEntry' => __DIR__ . '/includes/logging/LogEntry.php', 'MapCacheLRU' => __DIR__ . '/includes/libs/MapCacheLRU.php', 'MappedIterator' => __DIR__ . '/includes/libs/MappedIterator.php', diff --git a/maintenance/manageJobs.php b/maintenance/manageJobs.php new file mode 100644 index 0000000000..9585ed82b6 --- /dev/null +++ b/maintenance/manageJobs.php @@ -0,0 +1,98 @@ +addDescription( 'Perform administrative tasks on a job queue' ); + $this->addOption( 'type', 'Job type', true, true ); + $this->addOption( 'action', 'Queue operation ("delete", "repush-abandoned")', true, true ); + } + + public function execute() { + $type = $this->getOption( 'type' ); + $action = $this->getOption( 'action' ); + + $group = JobQueueGroup::singleton(); + $queue = $group->get( $type ); + + if ( $action === 'delete' ) { + $this->delete( $queue ); + } elseif ( $action === 'repush-abandoned' ) { + $this->repushAbandoned( $queue ); + } else { + $this->error( "Invalid action '$action'.", 1 ); + } + } + + private function delete( JobQueue $queue ) { + $this->output( "Queue has {$queue->getSize()} job(s); deleting...\n" ); + $queue->delete(); + $this->output( "Done; current size is {$queue->getSize()} job(s).\n" ); + } + + private function repushAbandoned( JobQueue $queue ) { + $cache = ObjectCache::getInstance( CACHE_DB ); + $key = $cache->makeGlobalKey( 'last-job-repush', $queue->getWiki(), $queue->getType() ); + + $now = wfTimestampNow(); + $lastRepushTime = $cache->get( $key ); + if ( $lastRepushTime === false ) { + $lastRepushTime = wfTimestamp( TS_MW, 1 ); // include all jobs + } + + $this->output( "Last re-push time: $lastRepushTime; current time: $now\n" ); + + $count = 0; + $skipped = 0; + foreach ( $queue->getAllAbandonedJobs() as $job ) { + /** @var Job $job */ + if ( $job->getQueuedTimestamp() < $lastRepushTime ) { + ++$skipped; + continue; // already re-pushed in prior round + } + + $queue->push( $job ); + ++$count; + + if ( ( $count % $this->mBatchSize ) == 0 ) { + $queue->waitForBackups(); + } + } + + $cache->set( $key, $now ); // next run will ignore these jobs + + $this->output( "Re-pushed $count job(s) [$skipped skipped].\n" ); + } +} + +$maintClass = "ManageJobs"; +require_once RUN_MAINTENANCE_IF_MAIN;