OutputPage: Reduce getTitleInfo() calls (improve preloading)
authorTimo Tijhof <krinklemail@gmail.com>
Thu, 20 Oct 2016 21:43:57 +0000 (22:43 +0100)
committerAaron Schulz <aschulz@wikimedia.org>
Thu, 20 Oct 2016 21:59:23 +0000 (21:59 +0000)
* Remove filter between $moduleStyles and preloadTitleInfo().
  Previously, this was filtering out wiki modules created by
  gadgets and extensions. Still causing a couple of direct queries
  from getTitleInfo().

* Store __METHOD__ in $fname outside getWithSetCallback.
  This way queries are logged as either getTitleInfo or preloadTitleInfo.
  This regressed in 0852a000a5, after which the latter was logged
  as "::{closure}".

Change-Id: I454e43f43f8ad3270b86f4cfdbd68192c305cc07

includes/OutputPage.php
includes/resourceloader/ResourceLoaderWikiModule.php

index 50f9eb9..8e34a5a 100644 (file)
@@ -2688,15 +2688,13 @@ class OutputPage extends ContextSource {
                        $exemptStates = [];
                        $moduleStyles = $this->getModuleStyles( /*filter*/ true );
 
-                       // Batch preload getTitleInfo for isKnownEmpty() calls below
-                       $exemptModules = array_filter( $moduleStyles,
-                               function ( $name ) use ( $rl, &$exemptGroups ) {
-                                       $module = $rl->getModule( $name );
-                                       return $module && isset( $exemptGroups[ $module->getGroup() ] );
-                               }
-                       );
-                       ResourceLoaderWikiModule::preloadTitleInfo(
-                               $context, wfGetDB( DB_REPLICA ), $exemptModules );
+                       // Preload getTitleInfo for isKnownEmpty calls below and in ResourceLoaderClientHtml
+                       // Separate user-specific batch for improved cache-hit ratio.
+                       $userBatch = [ 'user.styles', 'user' ];
+                       $siteBatch = array_diff( $moduleStyles, $userBatch );
+                       $dbr = wfGetDB( DB_REPLICA );
+                       ResourceLoaderWikiModule::preloadTitleInfo( $context, $dbr, $siteBatch );
+                       ResourceLoaderWikiModule::preloadTitleInfo( $context, $dbr, $userBatch );
 
                        // Filter out modules handled by buildExemptModules()
                        $moduleStyles = array_filter( $moduleStyles,
index 9c3b41c..3deeb84 100644 (file)
@@ -360,21 +360,22 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        }
                }
 
-               $allPageNames = array_keys( $allPages );
-               sort( $allPageNames );
-               $hash = sha1( implode( '|', $allPageNames ) );
+               $pageNames = array_keys( $allPages );
+               sort( $pageNames );
+               $hash = sha1( implode( '|', $pageNames ) );
 
                // Avoid Zend bug where "static::" does not apply LSB in the closure
                $func = [ static::class, 'fetchTitleInfo' ];
+               $fname = __METHOD__;
 
                $cache = ObjectCache::getMainWANInstance();
                $allInfo = $cache->getWithSetCallback(
                        $cache->makeGlobalKey( 'resourceloader', 'titleinfo', $db->getWikiID(), $hash ),
                        $cache::TTL_HOUR,
-                       function ( $curValue, &$ttl, array &$setOpts ) use ( $func, $allPageNames, $db ) {
+                       function ( $curVal, &$ttl, array &$setOpts ) use ( $func, $pageNames, $db, $fname ) {
                                $setOpts += Database::getCacheSetOptions( $db );
 
-                               return call_user_func( $func, $db, $allPageNames, __METHOD__ );
+                               return call_user_func( $func, $db, $pageNames, $fname );
                        },
                        [ 'checkKeys' => [ $cache->makeGlobalKey( 'resourceloader', 'titleinfo', $db->getWikiID() ) ] ]
                );