Merge "Special:Newpages feed now shows first revision instead of latest revision"
[lhc/web/wiklou.git] / includes / deferred / LinksUpdate.php
index 0133f19..c6facd9 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
@@ -101,8 +102,6 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
        private $db;
 
        /**
-        * Constructor
-        *
         * @param Title $title Title of the page we're updating
         * @param ParserOutput $parserOutput Output from a full parse of this page
         * @param bool $recursive Queue jobs for recursive updates?
@@ -363,21 +362,24 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
        private function updateCategoryCounts( array $added, array $deleted ) {
                global $wgUpdateRowsPerQuery;
 
+               if ( !$added && !$deleted ) {
+                       return;
+               }
+
+               $wikiId = $this->getDB()->getWikiID();
                $wp = WikiPage::factory( $this->mTitle );
-               $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               $lbf = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               // T163801: try to release any row locks to reduce contention
+               $lbf->commitAndWaitForReplication( __METHOD__, $this->ticket, [ 'wiki' => $wikiId ] );
 
                foreach ( array_chunk( array_keys( $added ), $wgUpdateRowsPerQuery ) as $addBatch ) {
                        $wp->updateCategoryCounts( $addBatch, [], $this->mId );
-                       $factory->commitAndWaitForReplication(
-                               __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ]
-                       );
+                       $lbf->commitAndWaitForReplication( __METHOD__, $this->ticket, [ 'wiki' => $wikiId ] );
                }
 
                foreach ( array_chunk( array_keys( $deleted ), $wgUpdateRowsPerQuery ) as $deleteBatch ) {
                        $wp->updateCategoryCounts( [], $deleteBatch, $this->mId );
-                       $factory->commitAndWaitForReplication(
-                               __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ]
-                       );
+                       $lbf->commitAndWaitForReplication( __METHOD__, $this->ticket, [ 'wiki' => $wikiId ] );
                }
        }
 
@@ -398,7 +400,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
        private function incrTableUpdate( $table, $prefix, $deletions, $insertions ) {
                $services = MediaWikiServices::getInstance();
                $bSize = $services->getMainConfig()->get( 'UpdateRowsPerQuery' );
-               $factory = $services->getDBLoadBalancerFactory();
+               $lbf = $services->getDBLoadBalancerFactory();
 
                if ( $table === 'page_props' ) {
                        $fromField = 'pp_page';
@@ -408,7 +410,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
 
                $deleteWheres = []; // list of WHERE clause arrays for each DB delete() call
                if ( $table === 'pagelinks' || $table === 'templatelinks' || $table === 'iwlinks' ) {
-                       $baseKey =  ( $table === 'iwlinks' ) ? 'iwl_prefix' : "{$prefix}_namespace";
+                       $baseKey = ( $table === 'iwlinks' ) ? 'iwl_prefix' : "{$prefix}_namespace";
 
                        $curBatchSize = 0;
                        $curDeletionBatch = [];
@@ -450,7 +452,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
 
                foreach ( $deleteWheres as $deleteWhere ) {
                        $this->getDB()->delete( $table, $deleteWhere, __METHOD__ );
-                       $factory->commitAndWaitForReplication(
+                       $lbf->commitAndWaitForReplication(
                                __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ]
                        );
                }
@@ -458,7 +460,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                $insertBatches = array_chunk( $insertions, $bSize );
                foreach ( $insertBatches as $insertBatch ) {
                        $this->getDB()->insert( $table, $insertBatch, __METHOD__, 'IGNORE' );
-                       $factory->commitAndWaitForReplication(
+                       $lbf->commitAndWaitForReplication(
                                __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ]
                        );
                }