From 0b583944e45b65be94312fc855b5366615fa290c Mon Sep 17 00:00:00 2001 From: Lucas Werkmeister Date: Wed, 6 Feb 2019 19:49:12 +0100 Subject: [PATCH] Fix read-only mode for LoadBalancerSingle MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- .../libs/rdbms/loadbalancer/LoadBalancerSingle.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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'] ) ) { -- 2.20.1