rdbms: make IDatabase::isReadOnly() return true for replica DBs managed by LoadBalancer
authorAaron Schulz <aschulz@wikimedia.org>
Wed, 10 Jul 2019 06:51:24 +0000 (23:51 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Wed, 10 Jul 2019 06:51:24 +0000 (23:51 -0700)
Change-Id: I25b70fe0ea113c6741601cf0366a0fe9dc5cc3ef

includes/libs/rdbms/database/Database.php
tests/phpunit/includes/db/LoadBalancerTest.php

index e3c15fb..894a262 100644 (file)
@@ -4780,8 +4780,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         */
        protected function getReadOnlyReason() {
                $reason = $this->getLBInfo( 'readOnlyReason' );
+               if ( is_string( $reason ) ) {
+                       return $reason;
+               } elseif ( $this->getLBInfo( 'replica' ) ) {
+                       return "Server is configured in the role of a read-only replica database.";
+               }
 
-               return is_string( $reason ) ? $reason : false;
+               return false;
        }
 
        public function setTableAliases( array $aliases ) {
index 0c0b82b..f1bcd98 100644 (file)
@@ -129,6 +129,7 @@ class LoadBalancerTest extends MediaWikiTestCase {
 
                $dbr = $lb->getConnection( DB_REPLICA );
                $this->assertTrue( $dbr->getLBInfo( 'replica' ), 'replica shows as replica' );
+               $this->assertTrue( $dbr->isReadOnly(), 'replica shows as replica' );
                $this->assertEquals(
                        ( $wgDBserver != '' ) ? $wgDBserver : 'localhost',
                        $dbr->getLBInfo( 'clusterMasterHost' ),