From b728d6920b05c8b667651f7e99d749496474f02b Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Wed, 20 Aug 2014 16:41:59 -0700 Subject: [PATCH] Made getCachedRevisionObject() use MapCacheLRU * Previously the cache size was unbounded and leaky * Also made MapCacheLRU handle null values properly Change-Id: Ia02258cf051e1ccf11457c758741b8c7922afe89 --- includes/cache/MapCacheLRU.php | 6 +++--- includes/parser/CoreParserFunctions.php | 13 ++++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/includes/cache/MapCacheLRU.php b/includes/cache/MapCacheLRU.php index a22d8023d6..95e3af769e 100644 --- a/includes/cache/MapCacheLRU.php +++ b/includes/cache/MapCacheLRU.php @@ -57,7 +57,7 @@ class MapCacheLRU { * @return void */ public function set( $key, $value ) { - if ( isset( $this->cache[$key] ) ) { + if ( array_key_exists( $key, $this->cache ) ) { $this->ping( $key ); // push to top } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) { reset( $this->cache ); @@ -74,7 +74,7 @@ class MapCacheLRU { * @return bool */ public function has( $key ) { - return isset( $this->cache[$key] ); + return array_key_exists( $key, $this->cache ); } /** @@ -86,7 +86,7 @@ class MapCacheLRU { * @return mixed */ public function get( $key ) { - if ( isset( $this->cache[$key] ) ) { + if ( array_key_exists( $key, $this->cache ) ) { $this->ping( $key ); // push to top return $this->cache[$key]; } else { diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php index cd1f32dc4c..983fc1489f 100644 --- a/includes/parser/CoreParserFunctions.php +++ b/includes/parser/CoreParserFunctions.php @@ -1000,7 +1000,10 @@ class CoreParserFunctions { * @since 1.23 */ private static function getCachedRevisionObject( $parser, $title = null ) { - static $cache = array(); + static $cache = null; + if ( !isset( $cache ) ) { + $cache = new MapCacheLRU( 100 ); + } if ( is_null( $title ) ) { return null; @@ -1021,21 +1024,21 @@ class CoreParserFunctions { // Normalize name for cache $page = $title->getPrefixedDBkey(); - if ( array_key_exists( $page, $cache ) ) { // cache contains null values - return $cache[$page]; + if ( $cache->has( $page ) ) { // cache contains null values + return $cache->get( $page ); } if ( $parser->incrementExpensiveFunctionCount() ) { $rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL ); $pageID = $rev ? $rev->getPage() : 0; $revID = $rev ? $rev->getId() : 0; - $cache[$page] = $rev; // maybe null + $cache->set( $page, $rev ); // maybe null // Register dependency in templatelinks $parser->getOutput()->addTemplate( $title, $pageID, $revID ); return $rev; } - $cache[$page] = null; + $cache->set( $page, null ); return null; } -- 2.20.1