Merge "rdbms: turn LoadBalancer waitTimeout default into a class constant"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 4 Feb 2018 18:22:20 +0000 (18:22 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 4 Feb 2018 18:22:21 +0000 (18:22 +0000)
1  2 
includes/libs/rdbms/loadbalancer/LoadBalancer.php

@@@ -122,6 -122,8 +122,8 @@@ class LoadBalancer implements ILoadBala
  
        /** @var int Default 'maxLag' when unspecified */
        const MAX_LAG_DEFAULT = 10;
+       /** @var int Default 'waitTimeout' when unspecified */
+       const MAX_WAIT_DEFAULT = 10;
        /** @var int Seconds to cache master server read-only status */
        const TTL_CACHE_READONLY = 5;
  
                        : DatabaseDomain::newUnspecified();
                $this->setLocalDomain( $localDomain );
  
-               $this->mWaitTimeout = isset( $params['waitTimeout'] ) ? $params['waitTimeout'] : 10;
+               $this->mWaitTimeout = isset( $params['waitTimeout'] )
+                       ? $params['waitTimeout']
+                       : self::MAX_WAIT_DEFAULT;
  
                $this->mReadIndex = -1;
                $this->mConns = [
                        $knownReachedPos instanceof DBMasterPos &&
                        $knownReachedPos->hasReached( $this->mWaitForPos )
                ) {
 -                      $this->replLogger->debug( __METHOD__ .
 +                      $this->replLogger->debug(
 +                              __METHOD__ .
                                ': replica DB {dbserver} known to be caught up (pos >= $knownReachedPos).',
 -                              [ 'dbserver' => $server ] );
 +                              [ 'dbserver' => $server ]
 +                      );
                        return true;
                }
  
                $conn = $this->getAnyOpenConnection( $index );
                if ( !$conn ) {
                        if ( !$open ) {
 -                              $this->replLogger->debug( __METHOD__ . ': no connection open for {dbserver}',
 -                                      [ 'dbserver' => $server ] );
 +                              $this->replLogger->debug(
 +                                      __METHOD__ . ': no connection open for {dbserver}',
 +                                      [ 'dbserver' => $server ]
 +                              );
  
                                return false;
                        } else {
                                $conn = $this->openConnection( $index, self::DOMAIN_ANY );
                                if ( !$conn ) {
 -                                      $this->replLogger->warning( __METHOD__ . ': failed to connect to {dbserver}',
 -                                              [ 'dbserver' => $server ] );
 +                                      $this->replLogger->warning(
 +                                              __METHOD__ . ': failed to connect to {dbserver}',
 +                                              [ 'dbserver' => $server ]
 +                                      );
  
                                        return false;
                                }
                        }
                }
  
 -              $this->replLogger->info( __METHOD__ . ': Waiting for replica DB {dbserver} to catch up...',
 -                      [ 'dbserver' => $server ] );
 +              $this->replLogger->info(
 +                      __METHOD__ .
 +                      ': Waiting for replica DB {dbserver} to catch up...',
 +                      [ 'dbserver' => $server ]
 +              );
 +
                $timeout = $timeout ?: $this->mWaitTimeout;
                $result = $conn->masterPosWait( $this->mWaitForPos, $timeout );
  
 -              if ( $result == -1 || is_null( $result ) ) {
 -                      // Timed out waiting for replica DB, use master instead
 +              if ( $result === null ) {
 +                      $this->replLogger->warning(
 +                              __METHOD__ . ': Errored out waiting on {host} pos {pos}',
 +                              [
 +                                      'host' => $server,
 +                                      'pos' => $this->mWaitForPos,
 +                                      'trace' => ( new RuntimeException() )->getTraceAsString()
 +                              ]
 +                      );
 +                      $ok = false;
 +              } elseif ( $result == -1 ) {
                        $this->replLogger->warning(
                                __METHOD__ . ': Timed out waiting on {host} pos {pos}',
 -                              [ 'host' => $server, 'pos' => $this->mWaitForPos ]
 +                              [
 +                                      'host' => $server,
 +                                      'pos' => $this->mWaitForPos,
 +                                      'trace' => ( new RuntimeException() )->getTraceAsString()
 +                              ]
                        );
                        $ok = false;
                } else {
                        $result = $conn->masterPosWait( $pos, $timeout );
                        if ( $result == -1 || is_null( $result ) ) {
                                $msg = __METHOD__ . ': Timed out waiting on {host} pos {pos}';
 -                              $this->replLogger->warning( $msg,
 -                                      [ 'host' => $conn->getServer(), 'pos' => $pos ] );
 +                              $this->replLogger->warning( $msg, [
 +                                      'host' => $conn->getServer(),
 +                                      'pos' => $pos,
 +                                      'trace' => ( new RuntimeException() )->getTraceAsString()
 +                              ] );
                                $ok = false;
                        } else {
                                $this->replLogger->info( __METHOD__ . ': Done' );
                        }
                } else {
                        $ok = false; // something is misconfigured
 -                      $this->replLogger->error( 'Could not get master pos for {host}',
 -                              [ 'host' => $conn->getServer() ] );
 +                      $this->replLogger->error(
 +                              __METHOD__ . ': could not get master pos for {host}',
 +                              [
 +                                      'host' => $conn->getServer(),
 +                                      'trace' => ( new RuntimeException() )->getTraceAsString()
 +                              ]
 +                      );
                }
  
                return $ok;