From bb555ae71d1b400c39e620461d4f9ede39de6640 Mon Sep 17 00:00:00 2001 From: Amir Sarabadani Date: Wed, 9 Nov 2022 13:07:06 +0100 Subject: [PATCH] Add in-process cache for result of getPageImage() DB query There has been cases of different extensions calling this function for the same page title within the same web request, leading to duplicate queries and roundtrips. This avoids those. Maybe in future we could have APCu cache for it. Bug: T322528 Change-Id: I9b08b4de2648bf794bfdbfe57de9db433cfd79ee --- includes/PageImages.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/includes/PageImages.php b/includes/PageImages.php index 4c0c731..8cd0dd1 100644 --- a/includes/PageImages.php +++ b/includes/PageImages.php @@ -7,7 +7,9 @@ use ApiMain; use FauxRequest; use File; use IContextSource; +use MapCacheLRU; use MediaWiki\Api\Hook\ApiOpenSearchSuggestHook; +use MediaWiki\Cache\CacheKeyHelper; use MediaWiki\Hook\BeforePageDisplayHook; use MediaWiki\Hook\InfoActionHook; use MediaWiki\MediaWikiServices; @@ -59,6 +61,9 @@ class PageImages implements /** @var UserOptionsLookup */ private $userOptionsLookup; + /** @var MapCacheLRU */ + private static $cache = null; + /** * @param UserOptionsLookup $userOptionsLookup */ @@ -104,6 +109,13 @@ class PageImages implements * @return File|bool */ public static function getPageImage( Title $title ) { + $cacheKey = CacheKeyHelper::getKeyForPage( $title ); + if ( self::$cache === null ) { + self::$cache = new MapCacheLRU( 100 ); + } + if ( self::$cache->has( $cacheKey ) ) { + return self::$cache->get( $cacheKey ); + } // Do not query for special pages or other titles never in the database if ( !$title->canExist() ) { return false; @@ -115,6 +127,7 @@ class PageImages implements if ( !$title->exists() ) { // No page id to select from + self::$cache->set( $cacheKey, false ); return false; } @@ -134,6 +147,7 @@ class PageImages implements $file = MediaWikiServices::getInstance()->getRepoGroup()->findFile( $fileName ); } + self::$cache->set( $cacheKey, $file ); return $file; }