From: Lucas Werkmeister Date: Wed, 6 Feb 2019 18:49:12 +0000 (+0100) Subject: Fix read-only mode for LoadBalancerSingle X-Git-Tag: 1.34.0-rc.0~2711^2 X-Git-Url: https://git.cyclocoop.org/%7B%24admin_url%7Dmembres/something.jpg?a=commitdiff_plain;h=0b583944e4;p=lhc%2Fweb%2Fwiklou.git Fix read-only mode for LoadBalancerSingle For master connections, LoadBalancer unconditionally replaces the connection’s read-only mode with the load balancer’s, so if we don’t include the read-only reason in the parameters we pass to the parent constructor, the parameter we set on the connection has no effect. I attempted to write tests for this, but eventually had to stop wasting time on it, since I couldn’t get anywhere. Add a warning to the top of the class to discourage others from making the same mistake. Change-Id: I481553fac4f0f13a429ad4bbfdf15007c8299af9 --- diff --git a/includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php b/includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php index 2161b662f5..fcddfcf139 100644 --- a/includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php +++ b/includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php @@ -26,7 +26,12 @@ namespace Wikimedia\Rdbms; use InvalidArgumentException; /** - * Trivial LoadBalancer that always returns an injected connection handle + * Trivial LoadBalancer that always returns an injected connection handle. + * + * Note that, while this LoadBalancer does not open any connections itself, + * it still closes the injected connection at times, including during destruction. + * It is therefore unsuitable for use in tests unless you have a Database instance + * separate from the main test database (which is expected to stay open). */ class LoadBalancerSingle extends LoadBalancer { /** @var IDatabase */ @@ -55,7 +60,8 @@ class LoadBalancerSingle extends LoadBalancer { 'trxProfiler' => $params['trxProfiler'] ?? null, 'srvCache' => $params['srvCache'] ?? null, 'wanCache' => $params['wanCache'] ?? null, - 'localDomain' => $params['localDomain'] ?? $this->db->getDomainID() + 'localDomain' => $params['localDomain'] ?? $this->db->getDomainID(), + 'readOnlyReason' => $params['readOnlyReason'] ?? false, ] ); if ( isset( $params['readOnlyReason'] ) ) {