From: jenkins-bot Date: Mon, 23 Apr 2018 20:00:14 +0000 (+0000) Subject: Merge "Avoid locking aggregated SELECT in Category::refresh" X-Git-Tag: 1.34.0-rc.0~5635 X-Git-Url: https://git.cyclocoop.org/%7B%24admin_url%7Dmembres/modifier.php?a=commitdiff_plain;h=172925ae62e912c1e5484c05473662a45f0055ef;hp=93da7b630b1990879072912ef7b37cd2bc23f100;p=lhc%2Fweb%2Fwiklou.git Merge "Avoid locking aggregated SELECT in Category::refresh" --- diff --git a/includes/Category.php b/includes/Category.php index 6104b8a65a..46b86d8cd8 100644 --- a/includes/Category.php +++ b/includes/Category.php @@ -335,18 +335,28 @@ class Category { $dbw->startAtomic( __METHOD__ ); - $cond1 = $dbw->conditional( [ 'page_namespace' => NS_CATEGORY ], 1, 'NULL' ); - $cond2 = $dbw->conditional( [ 'page_namespace' => NS_FILE ], 1, 'NULL' ); - $result = $dbw->selectRow( + // Lock all the `categorylinks` records and gaps for this category; + // this is a separate query due to postgres/oracle limitations + $dbw->selectRowCount( [ 'categorylinks', 'page' ], - [ 'pages' => 'COUNT(*)', - 'subcats' => "COUNT($cond1)", - 'files' => "COUNT($cond2)" - ], + '*', [ 'cl_to' => $this->mName, 'page_id = cl_from' ], __METHOD__, [ 'LOCK IN SHARE MODE' ] ); + // Get the aggregate `categorylinks` row counts for this category + $catCond = $dbw->conditional( [ 'page_namespace' => NS_CATEGORY ], 1, 'NULL' ); + $fileCond = $dbw->conditional( [ 'page_namespace' => NS_FILE ], 1, 'NULL' ); + $result = $dbw->selectRow( + [ 'categorylinks', 'page' ], + [ + 'pages' => 'COUNT(*)', + 'subcats' => "COUNT($catCond)", + 'files' => "COUNT($fileCond)" + ], + [ 'cl_to' => $this->mName, 'page_id = cl_from' ], + __METHOD__ + ); $shouldExist = $result->pages > 0 || $this->getTitle()->exists();