From 37d7dc565391d741df15af22d6c30dd461ac8325 Mon Sep 17 00:00:00 2001 From: Roan Kattouw Date: Thu, 23 Dec 2010 21:01:54 +0000 Subject: [PATCH] (bug 26399) Preload module info for all modules in startup module, to prevent lots of individual queries. Also improve preloadModuleInfo() to register the absence of message blobs for modules that do have messages (they were being missed because they were expected to have blobs for this reason) --- includes/resourceloader/ResourceLoader.php | 11 +++++------ .../resourceloader/ResourceLoaderStartUpModule.php | 10 +++++++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index 9c4e13f70b..ce62b38540 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -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 ); } } diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php index f0c1e80f85..4d504e57c6 100644 --- a/includes/resourceloader/ResourceLoaderStartUpModule.php +++ b/includes/resourceloader/ResourceLoaderStartUpModule.php @@ -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 ) ); -- 2.20.1