rdbms: make safeWaitForMasterPos() handle master connection failure
authorAaron Schulz <aschulz@wikimedia.org>
Wed, 23 Jan 2019 19:32:18 +0000 (11:32 -0800)
committerAaron Schulz <aschulz@wikimedia.org>
Tue, 26 Feb 2019 18:46:44 +0000 (18:46 +0000)
Previously, in such cases where a master connection was needed
and could not be acquired, a fatal error would occur. Instead,
throw a DBReplicationWaitError exception.

Also removed a redundant documentation block for the method.

Change-Id: Ide3015d57673df0876daf265a0182fe41004052d

includes/libs/rdbms/loadbalancer/LoadBalancer.php

index f2e4e3d..9e4b15f 100644 (file)
@@ -1842,12 +1842,6 @@ class LoadBalancer implements ILoadBalancer {
                }
        }
 
-       /**
-        * @param IDatabase $conn
-        * @param DBMasterPos|bool $pos
-        * @param int|null $timeout
-        * @return bool
-        */
        public function safeWaitForMasterPos( IDatabase $conn, $pos = false, $timeout = null ) {
                $timeout = max( 1, $timeout ?: $this->waitTimeout );
 
@@ -1862,6 +1856,12 @@ class LoadBalancer implements ILoadBalancer {
                                $pos = $masterConn->getMasterPos();
                        } else {
                                $masterConn = $this->openConnection( $this->getWriterIndex(), self::DOMAIN_ANY );
+                               if ( !$masterConn ) {
+                                       throw new DBReplicationWaitError(
+                                               null,
+                                               "Could not obtain a master database connection to get the position"
+                                       );
+                               }
                                $pos = $masterConn->getMasterPos();
                                $this->closeConnection( $masterConn );
                        }