resourceloader: Reduce module_deps write slams after deployments
authorAaron Schulz <aschulz@wikimedia.org>
Thu, 28 Jan 2016 04:01:16 +0000 (20:01 -0800)
committerAaron Schulz <aschulz@wikimedia.org>
Tue, 2 Feb 2016 19:37:37 +0000 (11:37 -0800)
Bug: T124649
Change-Id: I8d45e538f7d3d098a89950e5777e0984c90d7e51

includes/resourceloader/ResourceLoaderModule.php

index 113fc84..0aa3be7 100644 (file)
@@ -433,16 +433,28 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                try {
                        // If the list has been modified since last time we cached it, update the cache
                        if ( $localFileRefs !== $this->getFileDependencies( $context ) ) {
+                               $cache = ObjectCache::getLocalClusterInstance();
+                               $key = $cache->makeKey( __METHOD__, $this->getName() );
+                               $scopeLock = $cache->getScopedLock( $key, 0 );
+                               if ( !$scopeLock ) {
+                                       return; // T124649; avoid write slams
+                               }
+
                                $vary = $context->getSkin() . '|' . $context->getLanguage();
                                $dbw = wfGetDB( DB_MASTER );
                                $dbw->replace( 'module_deps',
-                                       array( array( 'md_module', 'md_skin' ) ), array(
+                                       array( array( 'md_module', 'md_skin' ) ),
+                                       array(
                                                'md_module' => $this->getName(),
                                                'md_skin' => $vary,
                                                // Use relative paths to avoid ghost entries when $IP changes (T111481)
                                                'md_deps' => FormatJson::encode( self::getRelativePaths( $localFileRefs ) ),
                                        )
                                );
+
+                               $dbw->onTransactionIdle( function () use ( &$scopeLock ) {
+                                       ScopedCallback::consume( $scopeLock ); // release after commit
+                               } );
                        }
                } catch ( Exception $e ) {
                        wfDebugLog( 'resourceloader', __METHOD__ . ": failed to update DB: $e" );