From e50989394199129dcb2d59f085e166f58f10c47c Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Sun, 21 Aug 2005 06:07:48 +0000 Subject: [PATCH] Made BlockCache::loadFromDB() 100x faster. Wasn't an issue before ryo commented out the memcached bits, but since then, it was adding 1100ms to the save time --- includes/Block.php | 13 ++++++++++++- includes/BlockCache.php | 12 ++++++++++-- includes/User.php | 32 ++++++++++++++++++++++---------- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/includes/Block.php b/includes/Block.php index b5264ab964..ffd53d0197 100644 --- a/includes/Block.php +++ b/includes/Block.php @@ -9,6 +9,7 @@ */ define ( 'EB_KEEP_EXPIRED', 1 ); define ( 'EB_FOR_UPDATE', 2 ); +define ( 'EB_RANGE_ONLY', 4 ); /** * The block class @@ -189,14 +190,24 @@ class Block $db =& wfGetDB( DB_SLAVE ); $options = ''; } + if ( $flags & EB_RANGE_ONLY ) { + $cond = " WHERE ipb_address LIKE '%/%'"; + } else { + $cond = ''; + } + $ipblocks = $db->tableName( 'ipblocks' ); - $sql = "SELECT * FROM $ipblocks ORDER BY ipb_timestamp DESC $options"; + $sql = "SELECT * FROM $ipblocks $cond ORDER BY ipb_timestamp DESC $options"; $res = $db->query( $sql, 'Block::enumBans' ); $num_rows = $db->numRows( $res ); while ( $row = $db->fetchObject( $res ) ) { $block->initFromRow( $row ); + if ( ( $flags & EB_RANGE_ONLY ) && $block->getNetworkBits() == 32 ) { + continue; + } + if ( !( $flags & EB_KEEP_EXPIRED ) ) { if ( !$block->deleteIfExpired() ) { $callback( $block, $tag ); diff --git a/includes/BlockCache.php b/includes/BlockCache.php index 0df3a14cd6..cc3ab90d3b 100644 --- a/includes/BlockCache.php +++ b/includes/BlockCache.php @@ -40,15 +40,19 @@ class BlockCache */ function loadFromDB( $bFromSlave = false ) { global $wgUseMemCached, $wgMemc; + $fname = 'BlockCache::loadFromDB'; + wfProfileIn( $fname ); + $this->mData = array(); # Selecting FOR UPDATE is a convenient way to serialise the memcached and DB operations, # which is necessary even though we don't update the DB if ( !$bFromSlave ) { - Block::enumBlocks( 'wfBlockCacheInsert', '', EB_FOR_UPDATE ); + Block::enumBlocks( 'wfBlockCacheInsert', '', EB_FOR_UPDATE | EB_RANGE_ONLY ); #$wgMemc->set( $this->mMemcKey, $this->mData, 0 ); } else { - Block::enumBlocks( 'wfBlockCacheInsert', '' ); + Block::enumBlocks( 'wfBlockCacheInsert', '', EB_RANGE_ONLY ); } + wfProfileOut( $fname ); } /** @@ -98,6 +102,9 @@ class BlockCache * @param bool $bFromSlave True means to load check against slave, else check against master. */ function get( $ip, $bFromSlave ) { + $fname = 'BlockCache::get'; + wfProfileIn( $fname ); + $this->load( $bFromSlave ); $ipint = ip2long( $ip ); $blocked = false; @@ -121,6 +128,7 @@ class BlockCache $block = false; } + wfProfileOut( $fname ); return $block; } diff --git a/includes/User.php b/includes/User.php index 4b55c832bc..c0a8e0f50a 100644 --- a/includes/User.php +++ b/includes/User.php @@ -364,20 +364,23 @@ class User { if ( -1 != $this->mBlockedby ) { return; } + $fname = 'User::getBlockedStatus'; + wfProfileIn( $fname ); + $this->mBlockedby = 0; - # User blocking - if ( $this->mId ) { - $block = new Block(); - $block->forUpdate( $bFromSlave ); - if ( $block->load( $wgIP , $this->mId ) ) { - $this->mBlockedby = $block->mBy; - $this->mBlockreason = $block->mReason; + # User/IP blocking + $block = new Block(); + $block->forUpdate( $bFromSlave ); + if ( $block->load( $wgIP , $this->mId ) ) { + $this->mBlockedby = $block->mBy; + $this->mBlockreason = $block->mReason; + if ( $this->isLoggedIn() ) { $this->spreadBlock(); } } - # IP/range blocking + # Range blocking if ( !$this->mBlockedby ) { # Check first against slave, and optionally from master. $block = $wgBlockCache->get( $wgIP, true ); @@ -410,6 +413,7 @@ class User { } } } + wfProfileOut( $fname ); } function inSorbsBlacklist( $ip ) { @@ -475,6 +479,8 @@ class User { global $wgMemc, $wgIP, $wgDBname, $wgRateLimitLog; $fname = 'User::pingLimiter'; + wfProfileIn( $fname ); + $limits = $wgRateLimits[$action]; $keys = array(); $id = $this->getId(); @@ -521,6 +527,7 @@ class User { $wgMemc->incr( $key ); } + wfProfileOut( $fname ); return $triggered; } @@ -538,13 +545,18 @@ class User { */ function isBlockedFrom( $title, $bFromSlave = false ) { global $wgBlockAllowsUTEdit; + $fname = 'User::isBlockedFrom'; + wfProfileIn( $fname ); + if ( $wgBlockAllowsUTEdit && $title->getText() === $this->getName() && $title->getNamespace() == NS_USER_TALK ) { - return false; + $blocked = false; } else { - return $this->isBlocked( $bFromSlave ); + $blocked = $this->isBlocked( $bFromSlave ); } + wfProfileOut( $fname ); + return $blocked; } /** -- 2.20.1