The method hits the jobrunner backend to find out how many jobs are
enqueued in each of the JobQueue. It is publicly available via the
MediaWiki API request:
/w/api.php?action=query&meta=siteinfo&siprop=statistics
That is often used by bots when querying recent changes among other and
with fast bot cause useless queries toward the jobrunner backend.
Wrap SiteStats::jobs() with a WAN cache under key SiteStats:jobscount.
Drop SiteStats::$jobs private variable that was used for in process
cache. The WAN Cache does it for us via 'pcTTL'.
That is similar to SiteStats::numberingroup().
Set TTL to one minute, which should still give fresh enough results for
public uses.
Cover that behavior with a test.
When writing tests I noticed MediaWikiTestCase generates a few jobs due
to the creation of the UTPage page:
* HTMLCacheUpdateJob to refresh backlinks (eg: history)
* RecentChangesUpdateJob which happens randomly
Pass EDIT_SUPPRESS_RC to doEditContent to prevent the first and blindly
delete entries in the recentChangesUpdate jobqueue for the second.
Change-Id: I95a272d0691d779bfee9e7a671cbab66a113dfa1
36 lines
1.1 KiB
PHP
36 lines
1.1 KiB
PHP
<?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() );
|
|
}
|
|
|
|
}
|