rdbms: add domain sanity checks to LoadBalancer connection methods
authorAaron Schulz <aschulz@wikimedia.org>
Wed, 15 Aug 2018 02:24:37 +0000 (19:24 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Fri, 12 Oct 2018 02:16:49 +0000 (02:16 +0000)
Bug: T193565
Change-Id: I94d905277e01b8e30ac3f6532ece07388bb20cce

includes/libs/rdbms/loadbalancer/LoadBalancer.php

index d84ba65..ff762b4 100644 (file)
@@ -28,6 +28,7 @@ use BagOStuff;
 use EmptyBagOStuff;
 use WANObjectCache;
 use ArrayUtils;
+use UnexpectedValueException;
 use InvalidArgumentException;
 use RuntimeException;
 use Exception;
@@ -952,6 +953,17 @@ class LoadBalancer implements ILoadBalancer {
                        }
                }
 
+               // Final sanity check to make sure the right domain is selected
+               if (
+                       $conn instanceof IDatabase &&
+                       $this->localDomain->getDatabase() !== null &&
+                       $conn->getDomainID() !== $this->localDomain->getId()
+               ) {
+                       throw new UnexpectedValueException(
+                               "Got connection to '{$conn->getDomainID()}', " .
+                               "but expected local domain ('{$this->localDomain}')." );
+               }
+
                return $conn;
        }
 
@@ -1038,8 +1050,13 @@ class LoadBalancer implements ILoadBalancer {
                        }
                }
 
-               // Increment reference count
                if ( $conn instanceof IDatabase ) {
+                       // Final sanity check to make sure the right domain is selected
+                       if ( $domainInstance->getDatabase() !== null && $conn->getDomainID() !== $domain ) {
+                               throw new UnexpectedValueException(
+                                       "Got connection to '{$conn->getDomainID()}', but expected '$domain'." );
+                       }
+                       // Increment reference count
                        $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
                        $conn->setLBInfo( 'foreignPoolRefCount', $refCount + 1 );
                }