Merge "Resources: Remove very old comment about OOjs UI incompatibility"
[lhc/web/wiklou.git] / includes / deferred / SiteStatsUpdate.php
index 7bfafee..5a62185 100644 (file)
@@ -22,9 +22,6 @@
  * Class for handling updates to the site_stats table
  */
 class SiteStatsUpdate implements DeferrableUpdate {
-       /** @var int */
-       protected $views = 0;
-
        /** @var int */
        protected $edits = 0;
 
@@ -42,7 +39,6 @@ class SiteStatsUpdate implements DeferrableUpdate {
 
        // @todo deprecate this constructor
        function __construct( $views, $edits, $good, $pages = 0, $users = 0 ) {
-               $this->views = $views;
                $this->edits = $edits;
                $this->articles = $good;
                $this->pages = $pages;
@@ -56,7 +52,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
        public static function factory( array $deltas ) {
                $update = new self( 0, 0, 0 );
 
-               $fields = array( 'views', 'edits', 'pages', 'articles', 'users', 'images' );
+               $fields = [ 'views', 'edits', 'pages', 'articles', 'users', 'images' ];
                foreach ( $fields as $field ) {
                        if ( isset( $deltas[$field] ) && $deltas[$field] ) {
                                $update->$field = $deltas[$field];
@@ -69,6 +65,8 @@ class SiteStatsUpdate implements DeferrableUpdate {
        public function doUpdate() {
                global $wgSiteStatsAsyncFactor;
 
+               $this->doUpdateContextStats();
+
                $rate = $wgSiteStatsAsyncFactor; // convenience
                // If set to do so, only do actual DB updates 1 every $rate times.
                // The other times, just update "pending delta" values in memcached.
@@ -76,7 +74,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
                        $this->doUpdatePendingDeltas();
                } else {
                        // Need a separate transaction because this a global lock
-                       wfGetDB( DB_MASTER )->onTransactionIdle( array( $this, 'tryDBUpdateInternal' ) );
+                       wfGetDB( DB_MASTER )->onTransactionIdle( [ $this, 'tryDBUpdateInternal' ] );
                }
        }
 
@@ -88,7 +86,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
 
                $dbw = wfGetDB( DB_MASTER );
                $lockKey = wfMemcKey( 'site_stats' ); // prepend wiki ID
-               $pd = array();
+               $pd = [];
                if ( $wgSiteStatsAsyncFactor ) {
                        // Lock the table so we don't have double DB/memcached updates
                        if ( !$dbw->lockIsFree( $lockKey, __METHOD__ )
@@ -100,7 +98,6 @@ class SiteStatsUpdate implements DeferrableUpdate {
                        }
                        $pd = $this->getPendingDeltas();
                        // Piggy-back the async deltas onto those of this stats update....
-                       $this->views += ( $pd['ss_total_views']['+'] - $pd['ss_total_views']['-'] );
                        $this->edits += ( $pd['ss_total_edits']['+'] - $pd['ss_total_edits']['-'] );
                        $this->articles += ( $pd['ss_good_articles']['+'] - $pd['ss_good_articles']['-'] );
                        $this->pages += ( $pd['ss_total_pages']['+'] - $pd['ss_total_pages']['-'] );
@@ -110,14 +107,13 @@ class SiteStatsUpdate implements DeferrableUpdate {
 
                // Build up an SQL query of deltas and apply them...
                $updates = '';
-               $this->appendUpdate( $updates, 'ss_total_views', $this->views );
                $this->appendUpdate( $updates, 'ss_total_edits', $this->edits );
                $this->appendUpdate( $updates, 'ss_good_articles', $this->articles );
                $this->appendUpdate( $updates, 'ss_total_pages', $this->pages );
                $this->appendUpdate( $updates, 'ss_users', $this->users );
                $this->appendUpdate( $updates, 'ss_images', $this->images );
                if ( $updates != '' ) {
-                       $dbw->update( 'site_stats', array( $updates ), array(), __METHOD__ );
+                       $dbw->update( 'site_stats', [ $updates ], [], __METHOD__ );
                }
 
                if ( $wgSiteStatsAsyncFactor ) {
@@ -129,38 +125,47 @@ class SiteStatsUpdate implements DeferrableUpdate {
        }
 
        /**
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @return bool|mixed
         */
        public static function cacheUpdate( $dbw ) {
                global $wgActiveUserDays;
-               $dbr = wfGetDB( DB_SLAVE, array( 'SpecialStatistics', 'vslow' ) );
+               $dbr = wfGetDB( DB_SLAVE, 'vslow' );
                # Get non-bot users than did some recent action other than making accounts.
                # If account creation is included, the number gets inflated ~20+ fold on enwiki.
                $activeUsers = $dbr->selectField(
                        'recentchanges',
                        'COUNT( DISTINCT rc_user_text )',
-                       array(
+                       [
                                'rc_user != 0',
                                'rc_bot' => 0,
                                'rc_log_type != ' . $dbr->addQuotes( 'newusers' ) . ' OR rc_log_type IS NULL',
                                'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX )
                                        - $wgActiveUserDays * 24 * 3600 ) ),
-                       ),
+                       ],
                        __METHOD__
                );
                $dbw->update(
                        'site_stats',
-                       array( 'ss_active_users' => intval( $activeUsers ) ),
-                       array( 'ss_row_id' => 1 ),
+                       [ 'ss_active_users' => intval( $activeUsers ) ],
+                       [ 'ss_row_id' => 1 ],
                        __METHOD__
                );
 
                return $activeUsers;
        }
 
+       protected function doUpdateContextStats() {
+               $stats = RequestContext::getMain()->getStats();
+               foreach ( [ 'edits', 'articles', 'pages', 'users', 'images' ] as $type ) {
+                       $delta = $this->$type;
+                       if ( $delta !== 0 ) {
+                               $stats->updateCount( "site.$type", $delta );
+                       }
+               }
+       }
+
        protected function doUpdatePendingDeltas() {
-               $this->adjustPending( 'ss_total_views', $this->views );
                $this->adjustPending( 'ss_total_edits', $this->edits );
                $this->adjustPending( 'ss_good_articles', $this->articles );
                $this->adjustPending( 'ss_total_pages', $this->pages );
@@ -202,8 +207,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
         * @param int $delta Delta (positive or negative)
         */
        protected function adjustPending( $type, $delta ) {
-               global $wgMemc;
-
+               $cache = ObjectCache::getMainStashInstance();
                if ( $delta < 0 ) { // decrement
                        $key = $this->getTypeCacheKey( $type, '-' );
                } else { // increment
@@ -211,11 +215,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
                }
 
                $magnitude = abs( $delta );
-               if ( !$wgMemc->incr( $key, $magnitude ) ) { // not there?
-                       if ( !$wgMemc->add( $key, $magnitude ) ) { // race?
-                               $wgMemc->incr( $key, $magnitude );
-                       }
-               }
+               $cache->incrWithInit( $key, 0, $magnitude, $magnitude );
        }
 
        /**
@@ -223,15 +223,16 @@ class SiteStatsUpdate implements DeferrableUpdate {
         * @return array Positive and negative deltas for each type
         */
        protected function getPendingDeltas() {
-               global $wgMemc;
+               $cache = ObjectCache::getMainStashInstance();
 
-               $pending = array();
-               foreach ( array( 'ss_total_views', 'ss_total_edits',
-                       'ss_good_articles', 'ss_total_pages', 'ss_users', 'ss_images' ) as $type
+               $pending = [];
+               foreach ( [ 'ss_total_edits',
+                       'ss_good_articles', 'ss_total_pages', 'ss_users', 'ss_images' ] as $type
                ) {
                        // Get pending increments and pending decrements
-                       $pending[$type]['+'] = (int)$wgMemc->get( $this->getTypeCacheKey( $type, '+' ) );
-                       $pending[$type]['-'] = (int)$wgMemc->get( $this->getTypeCacheKey( $type, '-' ) );
+                       $flg = BagOStuff::READ_LATEST;
+                       $pending[$type]['+'] = (int)$cache->get( $this->getTypeCacheKey( $type, '+' ), $flg );
+                       $pending[$type]['-'] = (int)$cache->get( $this->getTypeCacheKey( $type, '-' ), $flg );
                }
 
                return $pending;
@@ -242,12 +243,12 @@ class SiteStatsUpdate implements DeferrableUpdate {
         * @param array $pd Result of getPendingDeltas(), used for DB update
         */
        protected function removePendingDeltas( array $pd ) {
-               global $wgMemc;
+               $cache = ObjectCache::getMainStashInstance();
 
                foreach ( $pd as $type => $deltas ) {
                        foreach ( $deltas as $sign => $magnitude ) {
                                // Lower the pending counter now that we applied these changes
-                               $wgMemc->decr( $this->getTypeCacheKey( $type, $sign ), $magnitude );
+                               $cache->decr( $this->getTypeCacheKey( $type, $sign ), $magnitude );
                        }
                }
        }