Merge "resourceloader: Reduce module_deps write slams after deployments"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 9 Feb 2016 22:50:26 +0000 (22:50 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 9 Feb 2016 22:50:26 +0000 (22:50 +0000)
1  2 
includes/resourceloader/ResourceLoaderModule.php

@@@ -180,7 -180,6 +180,7 @@@ abstract class ResourceLoaderModule imp
        /**
         * @since 1.27
         * @param LoggerInterface $logger
 +       * @return null
         */
        public function setLogger( LoggerInterface $logger ) {
                $this->logger = $logger;
         * This is used to retrieve data in batches. See ResourceLoader::preloadModuleInfo().
         * To save the data, use saveFileDependencies().
         *
 -       * @param string $skin Skin name
 -       * @param array $deps Array of file names
 +       * @param ResourceLoaderContext $context
 +       * @param string[] $files Array of file names
         */
        public function setFileDependencies( ResourceLoaderContext $context, $files ) {
                $vary = $context->getSkin() . '|' . $context->getLanguage();
                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" );