/** @var bool */
private static $loaded = false;
- /** @var int */
- private static $jobs;
-
/** @var int[] */
private static $pageCount = [];
}
/**
+ * Total number of jobs in the job queue.
* @return int
*/
static function jobs() {
- if ( !isset( self::$jobs ) ) {
- try{
- self::$jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
- } catch ( JobQueueError $e ) {
- self::$jobs = 0;
- }
- }
- return self::$jobs;
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+ return $cache->getWithSetCallback(
+ $cache->makeKey( 'SiteStats', 'jobscount' ),
+ $cache::TTL_MINUTE,
+ function ( $oldValue, &$ttl, array &$setOpts ) {
+ try{
+ $jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
+ } catch ( JobQueueError $e ) {
+ $jobs = 0;
+ }
+ return $jobs;
+ },
+ [ 'pcTTL' => $cache::TTL_PROC_LONG ]
+ );
}
/**
$page->doEditContent(
new WikitextContent( 'UTContent' ),
'UTPageSummary',
- EDIT_NEW,
+ EDIT_NEW | EDIT_SUPPRESS_RC,
false,
$user
);
+ // an edit always attempt to purge backlink links such as history
+ // pages. That is unneccessary.
+ JobQueueGroup::singleton()->get( 'htmlCacheUpdate' )->delete();
+ // WikiPages::doEditUpdates randomly adds RC purges
+ JobQueueGroup::singleton()->get( 'recentChangesUpdate' )->delete();
// doEditContent() probably started the session via
// User::loadFromSession(). Close it now.
--- /dev/null
+<?php
+
+class SiteStatsTest extends MediaWikiTestCase {
+
+ /**
+ * @covers SiteStats::jobs
+ */
+ function testJobsCountGetCached() {
+ $this->setService( 'MainWANObjectCache',
+ new WANObjectCache( [ 'cache' => new HashBagOStuff() ] ) );
+ $cache = \MediaWiki\MediaWikiServices::getInstance()->getMainWANObjectCache();
+ $jobq = JobQueueGroup::singleton();
+
+ $jobq->push( new NullJob( Title::newMainPage(), [] ) );
+ $this->assertEquals( 1, SiteStats::jobs(),
+ 'A single job enqueued bumps jobscount stat to 1' );
+
+ $jobq->push( new NullJob( Title::newMainPage(), [] ) );
+ $this->assertEquals( 1, SiteStats::jobs(),
+ 'SiteStats::jobs() count does not reflect addition ' .
+ 'of a second job (cached)'
+ );
+
+ $jobq->get( 'null' )->delete(); // clear jobqueue
+ $this->assertEquals( 0, $jobq->get( 'null' )->getSize(),
+ 'Job queue for NullJob has been cleaned' );
+
+ $cache->delete( $cache->makeKey( 'SiteStats', 'jobscount' ) );
+ $this->assertEquals( 1, SiteStats::jobs(),
+ 'jobs count is kept in process cache' );
+
+ $cache->clearProcessCache();
+ $this->assertEquals( 0, SiteStats::jobs() );
+ }
+
+}