From 869bea9c598e728be9497313aba61c4aa942cc03 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Wed, 26 Apr 2017 22:33:56 -0700 Subject: [PATCH] Release prior row locks beforehand in LinksUpdate::updateCategoryCounts Bug: T163801 Change-Id: I6a026ee9a249da5a8fd9ceb216416340a9188d3f --- includes/deferred/LinksUpdate.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/includes/deferred/LinksUpdate.php b/includes/deferred/LinksUpdate.php index a629458cc5..072c1e0d03 100644 --- a/includes/deferred/LinksUpdate.php +++ b/includes/deferred/LinksUpdate.php @@ -364,21 +364,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 ] ); } } @@ -399,7 +402,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'; @@ -451,7 +454,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() ] ); } @@ -459,7 +462,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() ] ); } -- 2.20.1