X-Git-Url: https://git.cyclocoop.org/%27.WWW_URL.%27admin/?a=blobdiff_plain;f=includes%2FSiteStats.php;h=f10e6a2d4013390e85f8eb022a1a4da7a3c75b75;hb=3f5626f3d26474fae61fd928785970e86fc6a099;hp=6ce1aed814022e036ee0e06b50b8e6943f5f222d;hpb=10d1b7d12b5d097413cd507740c5c71781c2580b;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SiteStats.php b/includes/SiteStats.php index 6ce1aed814..f10e6a2d40 100644 --- a/includes/SiteStats.php +++ b/includes/SiteStats.php @@ -33,10 +33,6 @@ class SiteStats { /** @var bool */ private static $loaded = false; - - /** @var int */ - private static $jobs; - /** @var int[] */ private static $pageCount = []; @@ -58,14 +54,6 @@ class SiteStats { self::$row = self::loadAndLazyInit(); - # This code is somewhat schema-agnostic, because I'm changing it in a minor release -- TS - if ( !isset( self::$row->ss_total_pages ) && self::$row->ss_total_pages == -1 ) { - # Update schema - $u = new SiteStatsUpdate( 0, 0, 0 ); - $u->doUpdate(); - self::$row = self::doLoad( wfGetDB( DB_REPLICA ) ); - } - self::$loaded = true; } @@ -87,20 +75,27 @@ class SiteStats { } } - if ( !$wgMiserMode && !self::isSane( $row ) ) { - // Normally the site_stats table is initialized at install time. - // Some manual construction scenarios may leave the table empty or - // broken, however, for instance when importing from a dump into a - // clean schema with mwdumper. - wfDebug( __METHOD__ . ": initializing damaged or missing site_stats\n" ); - - SiteStatsInit::doAllAndCommit( wfGetDB( DB_REPLICA ) ); + if ( !self::isSane( $row ) ) { + if ( $wgMiserMode ) { + // Start off with all zeroes, assuming that this is a new wiki or any + // repopulations where done manually via script. + SiteStatsInit::doPlaceholderInit(); + } else { + // Normally the site_stats table is initialized at install time. + // Some manual construction scenarios may leave the table empty or + // broken, however, for instance when importing from a dump into a + // clean schema with mwdumper. + wfDebug( __METHOD__ . ": initializing damaged or missing site_stats\n" ); + SiteStatsInit::doAllAndCommit( wfGetDB( DB_REPLICA ) ); + } $row = self::doLoad( wfGetDB( DB_MASTER ) ); } if ( !self::isSane( $row ) ) { wfDebug( __METHOD__ . ": site_stats persistently nonsensical o_O\n" ); + + $row = (object)array_fill_keys( self::selectFields(), 0 ); } return $row; @@ -111,15 +106,7 @@ class SiteStats { * @return bool|stdClass */ static function doLoad( $db ) { - return $db->selectRow( 'site_stats', [ - 'ss_row_id', - 'ss_total_edits', - 'ss_good_articles', - 'ss_total_pages', - 'ss_users', - 'ss_active_users', - 'ss_images', - ], [], __METHOD__ ); + return $db->selectRow( 'site_stats', self::selectFields(), [], __METHOD__ ); } /** @@ -213,24 +200,24 @@ class SiteStats { } /** + * 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; - } - /** - * Zero rows still do single row read for row that doesn't exist, - * but people are annoyed by that - */ - if ( self::$jobs == 1 ) { - 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 ] + ); } /** @@ -251,6 +238,21 @@ class SiteStats { return self::$pageCount[$ns]; } + /** + * @return array + */ + public static function selectFields() { + return [ + 'ss_row_id', + 'ss_total_edits', + 'ss_good_articles', + 'ss_total_pages', + 'ss_users', + 'ss_active_users', + 'ss_images', + ]; + } + /** * Is the provided row of site stats sane, or should it be regenerated? * @@ -296,9 +298,8 @@ class SiteStatsInit { private $mUsers = null, $mFiles = null; /** - * Constructor * @param bool|IDatabase $database - * - boolean: Whether to use the master DB + * - bool: Whether to use the master DB * - IDatabase: Database connection to use */ public function __construct( $database = false ) { @@ -383,10 +384,10 @@ class SiteStatsInit { * for the original initStats, but without output. * * @param IDatabase|bool $database - * - boolean: Whether to use the master DB + * - bool: Whether to use the master DB * - IDatabase: Database connection to use * @param array $options Array of options, may contain the following values - * - activeUsers boolean: Whether to update the number of active users (default: false) + * - activeUsers bool: Whether to update the number of active users (default: false) */ public static function doAllAndCommit( $database, array $options = [] ) { $options += [ 'update' => false, 'activeUsers' => false ]; @@ -408,6 +409,21 @@ class SiteStatsInit { } } + /** + * Insert a dummy row with all zeroes if no row is present + */ + public static function doPlaceholderInit() { + $dbw = wfGetDB( DB_MASTER ); + if ( $dbw->selectRow( 'site_stats', '1', [], __METHOD__ ) === false ) { + $dbw->insert( + 'site_stats', + array_fill_keys( SiteStats::selectFields(), 0 ), + __METHOD__, + [ 'IGNORE' ] + ); + } + } + /** * Refresh site_stats */