rdbms: split out private LoadBalancer::getServerInfoStrict method
authorAaron Schulz <aschulz@wikimedia.org>
Tue, 18 Jun 2019 22:54:36 +0000 (23:54 +0100)
committerAaron Schulz <aschulz@wikimedia.org>
Sat, 22 Jun 2019 18:36:29 +0000 (11:36 -0700)
Change-Id: I9f77a07c75696f4a8353872375a7306d7734625a

includes/libs/rdbms/loadbalancer/LoadBalancer.php

index c08655c..6617ab1 100644 (file)
@@ -1001,11 +1001,8 @@ class LoadBalancer implements ILoadBalancer {
                if ( isset( $this->conns[$connKey][$i][0] ) ) {
                        $conn = $this->conns[$connKey][$i][0];
                } else {
-                       if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) {
-                               throw new InvalidArgumentException( "No server with index '$i'" );
-                       }
                        // Open a new connection
-                       $server = $this->servers[$i];
+                       $server = $this->getServerInfoStrict( $i );
                        $server['serverIndex'] = $i;
                        $server['autoCommitOnly'] = $autoCommit;
                        $conn = $this->reallyOpenConnection( $server, $this->localDomain );
@@ -1115,11 +1112,8 @@ class LoadBalancer implements ILoadBalancer {
                }
 
                if ( !$conn ) {
-                       if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) {
-                               throw new InvalidArgumentException( "No server with index '$i'" );
-                       }
                        // Open a new connection
-                       $server = $this->servers[$i];
+                       $server = $this->getServerInfoStrict( $i );
                        $server['serverIndex'] = $i;
                        $server['foreignPoolRefCount'] = 0;
                        $server['foreign'] = true;
@@ -1337,7 +1331,7 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function getServerName( $i ) {
-               $name = $this->servers[$i]['hostName'] ?? $this->servers[$i]['host'] ?? '';
+               $name = $this->servers[$i]['hostName'] ?? ( $this->servers[$i]['host'] ?? '' );
 
                return ( $name != '' ) ? $name : 'localhost';
        }
@@ -1942,7 +1936,7 @@ class LoadBalancer implements ILoadBalancer {
                        foreach ( $lagTimes as $i => $lag ) {
                                if ( $this->genericLoads[$i] > 0 && $lag > $maxLag ) {
                                        $maxLag = $lag;
-                                       $host = $this->servers[$i]['host'];
+                                       $host = $this->getServerInfoStrict( $i, 'host' );
                                        $maxIndex = $i;
                                }
                        }
@@ -2150,6 +2144,28 @@ class LoadBalancer implements ILoadBalancer {
                }
        }
 
+       /**
+        * @param int $i Server index
+        * @param string|null $field Server index field [optional]
+        * @return array|mixed
+        * @throws InvalidArgumentException
+        */
+       private function getServerInfoStrict( $i, $field = null ) {
+               if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) {
+                       throw new InvalidArgumentException( "No server with index '$i'" );
+               }
+
+               if ( $field !== null ) {
+                       if ( !array_key_exists( $field, $this->servers[$i] ) ) {
+                               throw new InvalidArgumentException( "No field '$field' in server index '$i'" );
+                       }
+
+                       return $this->servers[$i][$field];
+               }
+
+               return $this->servers[$i];
+       }
+
        function __destruct() {
                // Avoid connection leaks for sanity
                $this->disable();