(bug 26399) Preload module info for all modules in startup module, to prevent lots...
authorRoan Kattouw <catrope@users.mediawiki.org>
Thu, 23 Dec 2010 21:01:54 +0000 (21:01 +0000)
committerRoan Kattouw <catrope@users.mediawiki.org>
Thu, 23 Dec 2010 21:01:54 +0000 (21:01 +0000)
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderStartUpModule.php

index 9c4e13f..ce62b38 100644 (file)
@@ -51,7 +51,7 @@ class ResourceLoader {
         * @param $modules Array: List of module names to preload information for
         * @param $context ResourceLoaderContext: Context to load the information within
         */
-       protected function preloadModuleInfo( array $modules, ResourceLoaderContext $context ) {
+       public function preloadModuleInfo( array $modules, ResourceLoaderContext $context ) {
                if ( !count( $modules ) ) {
                        return; // or else Database*::select() will explode, plus it's cheaper!
                }
@@ -82,14 +82,12 @@ class ResourceLoader {
                
                // Get message blob mtimes. Only do this for modules with messages
                $modulesWithMessages = array();
-               $modulesWithoutMessages = array();
                foreach ( $modules as $name ) {
                        if ( count( $this->getModule( $name )->getMessages() ) ) {
                                $modulesWithMessages[] = $name;
-                       } else {
-                               $modulesWithoutMessages[] = $name;
                        }
                }
+               $modulesWithoutMessages = array_flip( $modules ); // Will be trimmed down by the loop below
                if ( count( $modulesWithMessages ) ) {
                        $res = $dbr->select( 'msg_resource', array( 'mr_resource', 'mr_timestamp' ), array(
                                        'mr_resource' => $modulesWithMessages,
@@ -98,9 +96,10 @@ class ResourceLoader {
                        );
                        foreach ( $res as $row ) {
                                $this->getModule( $row->mr_resource )->setMsgBlobMtime( $lang, $row->mr_timestamp );
+                               unset( $modulesWithoutMessages[$row->mr_resource] );
                        }
-               }
-               foreach ( $modulesWithoutMessages as $name ) {
+               } 
+               foreach ( array_keys( $modulesWithoutMessages ) as $name ) {
                        $this->getModule( $name )->setMsgBlobMtime( $lang, 0 );
                }
        }
index f0c1e80..4d504e5 100644 (file)
@@ -189,13 +189,17 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                if ( isset( $this->modifiedTime[$hash] ) ) {
                        return $this->modifiedTime[$hash];
                }
-               $this->modifiedTime[$hash] = filemtime( "$IP/resources/startup.js" );
 
-               // ATTENTION!: Because of the line above, this is not going to cause 
+               // Call preloadModuleInfo() on ALL modules as we're about
+               // to call getModifiedTime() on all of them
+               $loader = $context->getResourceLoader();
+               $loader->preloadModuleInfo( $loader->getModuleNames(), $context );
+
+               $this->modifiedTime[$hash] = filemtime( "$IP/resources/startup.js" );
+               // ATTENTION!: Because of the line above, this is not going to cause
                // infinite recursion - think carefully before making changes to this 
                // code!
                $time = wfTimestamp( TS_UNIX, $wgCacheEpoch );
-               $loader = $context->getResourceLoader();
                foreach ( $loader->getModuleNames() as $name ) {
                        $module = $loader->getModule( $name );
                        $time = max( $time, $module->getModifiedTime( $context ) );