Made BlockCache::loadFromDB() 100x faster. Wasn't an issue before ryo commented out...
authorTim Starling <tstarling@users.mediawiki.org>
Sun, 21 Aug 2005 06:07:48 +0000 (06:07 +0000)
committerTim Starling <tstarling@users.mediawiki.org>
Sun, 21 Aug 2005 06:07:48 +0000 (06:07 +0000)
includes/Block.php
includes/BlockCache.php
includes/User.php

index b5264ab..ffd53d0 100644 (file)
@@ -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 );
index 0df3a14..cc3ab90 100644 (file)
@@ -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;
        }
 
index 4b55c83..c0a8e0f 100644 (file)
@@ -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;
        }
 
        /**