From af89b09a067095027e64094423bc54f1b7e8499c Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Mon, 3 Sep 2012 12:45:50 -0700 Subject: [PATCH] Limit the Title backlink cache to two instances. Change-Id: I1e17a3de20d7c84a9818a850d4b7cc2898f72dc2 --- includes/BacklinkCache.php | 28 ++++++++++++++++++++++++---- includes/Title.php | 8 ++------ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/includes/BacklinkCache.php b/includes/BacklinkCache.php index 2aba29f65b..824c38a216 100644 --- a/includes/BacklinkCache.php +++ b/includes/BacklinkCache.php @@ -41,6 +41,8 @@ * @internal documentation reviewed on 18 Mar 2011 by hashar */ class BacklinkCache { + /** @var ProcessCacheLRU */ + protected static $cache; /** * Multi dimensions array representing batches. Keys are: @@ -81,12 +83,30 @@ class BacklinkCache { /** * Create a new BacklinkCache - * @param Title $title : Title object to create a backlink cache for. + * + * @param Title $title : Title object to create a backlink cache for */ - function __construct( $title ) { + public function __construct( Title $title ) { $this->title = $title; } + /** + * Create a new BacklinkCache or reuse any existing one + * + * @param Title $title : Title object to get a backlink cache for + * @return BacklinkCache + */ + public static function get( Title $title ) { + if ( !self::$cache ) { // init cache + self::$cache = new ProcessCacheLRU( 2 ); + } + $dbKey = $title->getPrefixedDBkey(); + if ( !self::$cache->has( $dbKey, 'obj' ) ) { + self::$cache->set( $dbKey, 'obj', new self( $title ) ); + } + return self::$cache->get( $dbKey, 'obj' ); + } + /** * Serialization handler, diasallows to serialize the database to prevent * failures after this class is deserialized from cache with dead DB @@ -303,7 +323,7 @@ class BacklinkCache { */ public function partition( $table, $batchSize ) { - // 1) try partition cache ... + // 1) try partition cache ... if ( isset( $this->partitionCache[$table][$batchSize] ) ) { wfDebug( __METHOD__ . ": got from partition cache\n" ); @@ -358,7 +378,7 @@ class BacklinkCache { * Partition a DB result with backlinks in it into batches * @param $res ResultWrapper database result * @param $batchSize integer - * @return array @see + * @return array @see */ protected function partitionResult( $res, $batchSize ) { $batches = array(); diff --git a/includes/Title.php b/includes/Title.php index eccae70a49..98961f818d 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -84,7 +84,6 @@ class Title { var $mLength = -1; // /< The page length, 0 for special pages var $mRedirect = null; // /< Is the article at this title a redirect? var $mNotificationTimestamp = array(); // /< Associative array of user ID -> timestamp/false - var $mBacklinkCache = null; // /< Cache of links to this title var $mHasSubpage; // /< Whether a page has any subpages // @} @@ -4477,11 +4476,8 @@ class Title { * * @return BacklinkCache */ - function getBacklinkCache() { - if ( is_null( $this->mBacklinkCache ) ) { - $this->mBacklinkCache = new BacklinkCache( $this ); - } - return $this->mBacklinkCache; + public function getBacklinkCache() { + return BacklinkCache::get( $this ); } /** -- 2.20.1