Merge "Avoid DB_MASTER queries in User::newSystemUser() when possible"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sat, 3 Jun 2017 05:16:08 +0000 (05:16 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sat, 3 Jun 2017 05:16:08 +0000 (05:16 +0000)
1  2 
includes/user/User.php

diff --combined includes/user/User.php
@@@ -693,19 -693,31 +693,31 @@@ class User implements IDBAccessObject 
                        return null;
                }
  
-               $fields = self::selectFields();
-               $dbw = wfGetDB( DB_MASTER );
-               $row = $dbw->selectRow(
+               $dbr = wfGetDB( DB_REPLICA );
+               $row = $dbr->selectRow(
                        'user',
-                       $fields,
+                       self::selectFields(),
                        [ 'user_name' => $name ],
                        __METHOD__
                );
+               if ( !$row ) {
+                       // Try the master database...
+                       $dbw = wfGetDB( DB_MASTER );
+                       $row = $dbw->selectRow(
+                               'user',
+                               self::selectFields(),
+                               [ 'user_name' => $name ],
+                               __METHOD__
+                       );
+               }
                if ( !$row ) {
                        // No user. Create it?
-                       return $options['create'] ? self::createNew( $name, [ 'token' => self::INVALID_TOKEN ] ) : null;
+                       return $options['create']
+                               ? self::createNew( $name, [ 'token' => self::INVALID_TOKEN ] )
+                               : null;
                }
                $user = self::newFromRow( $row );
  
                // A user is considered to exist as a non-system user if it can
                $id = $this->getId();
                $userLimit = false;
                $isNewbie = $this->isNewbie();
 +              $cache = ObjectCache::getLocalClusterInstance();
  
                if ( $id == 0 ) {
                        // limits for anons
                        if ( isset( $limits['anon'] ) ) {
 -                              $keys[wfMemcKey( 'limiter', $action, 'anon' )] = $limits['anon'];
 +                              $keys[$cache->makeKey( 'limiter', $action, 'anon' )] = $limits['anon'];
                        }
                } else {
                        // limits for logged-in users
                        }
                        // limits for newbie logged-in users
                        if ( $isNewbie && isset( $limits['newbie'] ) ) {
 -                              $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $limits['newbie'];
 +                              $keys[$cache->makeKey( 'limiter', $action, 'user', $id )] = $limits['newbie'];
                        }
                }
  
                if ( $userLimit !== false ) {
                        list( $max, $period ) = $userLimit;
                        wfDebug( __METHOD__ . ": effective user limit: $max in {$period}s\n" );
 -                      $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $userLimit;
 +                      $keys[$cache->makeKey( 'limiter', $action, 'user', $id )] = $userLimit;
                }
  
                // ip-based limits for all ping-limitable users
                        }
                }
  
 -              $cache = ObjectCache::getLocalClusterInstance();
 -
                $triggered = false;
                foreach ( $keys as $key => $limit ) {
                        list( $max, $period ) = $limit;
        public function touch() {
                $id = $this->getId();
                if ( $id ) {
 -                      $key = wfMemcKey( 'user-quicktouched', 'id', $id );
 -                      ObjectCache::getMainWANInstance()->touchCheckKey( $key );
 +                      $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
 +                      $key = $cache->makeKey( 'user-quicktouched', 'id', $id );
 +                      $cache->touchCheckKey( $key );
                        $this->mQuickTouched = null;
                }
        }
  
                if ( $this->mId ) {
                        if ( $this->mQuickTouched === null ) {
 -                              $key = wfMemcKey( 'user-quicktouched', 'id', $this->mId );
 -                              $cache = ObjectCache::getMainWANInstance();
 +                              $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
 +                              $key = $cache->makeKey( 'user-quicktouched', 'id', $this->mId );
  
                                $this->mQuickTouched = wfTimestamp( TS_MW, $cache->getCheckKeyTime( $key ) );
                        }
                        $this->setToken(); // init token
                }
  
 +              if ( !is_string( $this->mName ) ) {
 +                      throw new RuntimeException( "User name field is not set." );
 +              }
 +
                $this->mTouched = $this->newTouchedTimestamp();
  
                $noPass = PasswordFactory::newInvalidPassword()->toString();