From 9a2ba8e21d820478f96adead39b544d92d1d6306 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Mon, 11 Jun 2018 17:23:49 -0700 Subject: [PATCH] Reduce frequency of refreshCounts() calls in LinksDeletionUpdate Bug: T195397 Change-Id: I0a39c735ec516b70c43c7a40583c43289550b687 --- includes/Category.php | 2 +- includes/deferred/LinksDeletionUpdate.php | 47 ++++++++++++++++------- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/includes/Category.php b/includes/Category.php index 46b86d8cd8..fb5916bba2 100644 --- a/includes/Category.php +++ b/includes/Category.php @@ -48,7 +48,7 @@ class Category { /** * Set up all member variables using a database query. - * @param int $mode + * @param int $mode One of (Category::LOAD_ONLY, Category::LAZY_INIT_ROW) * @throws MWException * @return bool True on success, false on failure. */ diff --git a/includes/deferred/LinksDeletionUpdate.php b/includes/deferred/LinksDeletionUpdate.php index 3c86d11ac6..9f6257c810 100644 --- a/includes/deferred/LinksDeletionUpdate.php +++ b/includes/deferred/LinksDeletionUpdate.php @@ -90,6 +90,7 @@ class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate { foreach ( $catBatches as $catBatch ) { $this->page->updateCategoryCounts( [], $catBatch, $id ); if ( count( $catBatches ) > 1 ) { + // Only sacrifice atomicity if necessary due to size $lbFactory->commitAndWaitForReplication( __METHOD__, $this->ticket, [ 'domain' => $dbw->getDomainID() ] ); @@ -98,19 +99,10 @@ class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate { // Refresh counts on categories that should be empty now if ( $title->getNamespace() === NS_CATEGORY ) { - $row = $dbw->selectRow( - 'category', - [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ], - [ 'cat_title' => $title->getDBkey(), 'cat_pages <= 100' ], - __METHOD__ - ); - if ( $row ) { - $cat = Category::newFromRow( $row, $title ); - // T166757: do the update after the main job DB commit - DeferredUpdates::addCallableUpdate( function () use ( $cat ) { - $cat->refreshCounts(); - } ); - } + // T166757: do the update after the main job DB commit + DeferredUpdates::addCallableUpdate( function () use ( $title ) { + $this->refreshCategoryIfEmpty( $title ); + } ); } $this->batchDeleteByPK( @@ -195,6 +187,35 @@ class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate { ScopedCallback::consume( $scopedLock ); } + /** + * @param Title $title + */ + private function refreshCategoryIfEmpty( Title $title ) { + $dbw = $this->getDB(); + + $row = $dbw->selectRow( + 'category', + [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ], + [ 'cat_title' => $title->getDBkey(), 'cat_pages <= 100' ], + __METHOD__ + ); + + if ( !$row ) { + return; // nothing to delete + } + + $cat = Category::newFromRow( $row, $title ); + $hasLink = $dbw->selectField( + 'categorylinks', + '1', + [ 'cl_to' => $title->getDBkey() ], + __METHOD__ + ); + if ( !$hasLink ) { + $cat->refreshCounts(); // delete the category table entry + } + } + private function batchDeleteByPK( $table, array $conds, array $pk, $bSize ) { $services = MediaWikiServices::getInstance(); $lbFactory = $services->getDBLoadBalancerFactory(); -- 2.20.1