From: Aaron Schulz Date: Wed, 31 Jan 2018 21:39:44 +0000 (-0800) Subject: SiteStats row initialization cleanups X-Git-Tag: 1.31.0-rc.0~722^2 X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=3f05f346a8e2c5766c72c0d982b8e5bcb0a61e5a SiteStats row initialization cleanups * Remove unreachable code (field cannot be both null and -1) * Avoid PHP warnings during test runs in miser mode due to the $row field being "false". * Init the site_stats row in unit tests to unbreak miser mode. Change-Id: Ieb45cb3068b71e01aa12c674e0bfcf13a7f2493c --- diff --git a/includes/SiteStats.php b/includes/SiteStats.php index ce87596a5f..f10e6a2d40 100644 --- a/includes/SiteStats.php +++ b/includes/SiteStats.php @@ -33,7 +33,6 @@ class SiteStats { /** @var bool */ private static $loaded = false; - /** @var int[] */ private static $pageCount = []; @@ -55,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; } @@ -84,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; @@ -108,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__ ); } /** @@ -248,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? * @@ -404,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 */ diff --git a/tests/phpunit/MediaWikiTestCase.php b/tests/phpunit/MediaWikiTestCase.php index fe8c917564..3f4c8c0c88 100644 --- a/tests/phpunit/MediaWikiTestCase.php +++ b/tests/phpunit/MediaWikiTestCase.php @@ -1080,6 +1080,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase { } } + SiteStatsInit::doPlaceholderInit(); + User::resetIdByNameCache(); // Make sysop user