Reduce contention during view-based category count refreshes
authorAaron Schulz <aschulz@wikimedia.org>
Thu, 6 Apr 2017 00:25:45 +0000 (17:25 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Thu, 6 Apr 2017 00:34:57 +0000 (17:34 -0700)
Bug: T162121
Change-Id: I05b539922508d5e73979ccc8ea1c148b16dd13db

includes/CategoryViewer.php

index 31369b0..0205d70 100644 (file)
@@ -742,7 +742,13 @@ class CategoryViewer extends ContextSource {
                        $totalcnt = $rescnt;
                        $category = $this->cat;
                        DeferredUpdates::addCallableUpdate( function () use ( $category ) {
-                               $category->refreshCounts();
+                               # Avoid excess contention on the same category (T162121)
+                               $dbw = wfGetDB( DB_MASTER );
+                               $name = __METHOD__ . ':' . md5( $this->mName );
+                               $scopedLock = $dbw->getScopedLockAndFlush( $name, __METHOD__, 1 );
+                               if ( $scopedLock ) {
+                                       $category->refreshCounts();
+                               }
                        } );
                } else {
                        // Case 3: hopeless.  Don't give a total count at all.