diff options
Diffstat (limited to 'includes/SiteStats.php')
-rw-r--r-- | includes/SiteStats.php | 62 |
1 files changed, 49 insertions, 13 deletions
diff --git a/includes/SiteStats.php b/includes/SiteStats.php index e320a196..d7b9161a 100644 --- a/includes/SiteStats.php +++ b/includes/SiteStats.php @@ -5,7 +5,7 @@ */ class SiteStats { static $row, $loaded = false; - static $admins; + static $admins, $jobs; static $pageCount = array(); static function recache() { @@ -27,24 +27,26 @@ class SiteStats { $dbr = wfGetDB( DB_SLAVE ); self::$row = $dbr->selectRow( 'site_stats', '*', false, __METHOD__ ); } + + self::$loaded = true; } static function loadAndLazyInit() { wfDebug( __METHOD__ . ": reading site_stats from slave\n" ); $row = self::doLoad( wfGetDB( DB_SLAVE ) ); - - if( $row === false ) { - // Might have just been initialzed during this request? - wfDebug( __METHOD__ . ": site_stats missing on slave\n" ); + + if( !self::isSane( $row ) ) { + // Might have just been initialized during this request? Underflow? + wfDebug( __METHOD__ . ": site_stats damaged or missing on slave\n" ); $row = self::doLoad( wfGetDB( DB_MASTER ) ); } - if( $row === false ) { + if( !self::isSane( $row ) ) { // Normally the site_stats table is initialized at install time. - // Some manual construction scenarios may leave the table empty, - // however, for instance when importing from a dump into a clean - // schema with mwdumper. - wfDebug( __METHOD__ . ": initializing empty site_stats\n" ); + // 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" ); global $IP; require_once "$IP/maintenance/initStats.inc"; @@ -56,8 +58,8 @@ class SiteStats { $row = self::doLoad( wfGetDB( DB_MASTER ) ); } - if( $row === false ) { - wfDebug( __METHOD__ . ": init of site_stats failed o_O\n" ); + if( !self::isSane( $row ) ) { + wfDebug( __METHOD__ . ": site_stats persistently nonsensical o_O\n" ); } return $row; } @@ -104,6 +106,18 @@ class SiteStats { return self::$admins; } + static function jobs() { + if ( !isset( self::$jobs ) ) { + $dbr = wfGetDB( DB_SLAVE ); + self::$jobs = $dbr->estimateRowCount('job'); + /* 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; + } + static function pagesInNs( $ns ) { wfProfileIn( __METHOD__ ); if( !isset( self::$pageCount[$ns] ) ) { @@ -114,6 +128,28 @@ class SiteStats { return $pageCount[$ns]; } + /** Is the provided row of site stats sane, or should it be regenerated? */ + private static function isSane( $row ) { + if( + $row === false + or $row->ss_total_pages < $row->ss_good_articles + or $row->ss_total_edits < $row->ss_total_pages + or $row->ss_users < $row->ss_admins + ) { + return false; + } + // Now check for underflow/overflow + foreach( array( 'total_views', 'total_edits', 'good_articles', + 'total_pages', 'users', 'admins', 'images' ) as $member ) { + if( + $row->{"ss_$member"} > 2000000000 + or $row->{"ss_$member"} < 0 + ) { + return false; + } + } + return true; + } } @@ -200,4 +236,4 @@ class SiteStatsUpdate { */ } } -?> + |