Fix read-only mode for LoadBalancerSingle
authorLucas Werkmeister <lucas.werkmeister@wikimedia.de>
Wed, 6 Feb 2019 18:49:12 +0000 (19:49 +0100)
committerLucas Werkmeister <lucas.werkmeister@wikimedia.de>
Fri, 8 Feb 2019 13:06:35 +0000 (14:06 +0100)
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

includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php

index 2161b66..fcddfcf 100644 (file)
@@ -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'] ) ) {