Skip to content

Commit faf5d4b

Browse files
Eliminate mutable field anti-patterns
1 parent 487137c commit faf5d4b

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

gateway-ha/src/main/java/io/trino/gateway/ha/clustermonitor/ClusterStatsJdbcMonitor.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*/
1414
package io.trino.gateway.ha.clustermonitor;
1515

16+
import com.google.common.collect.ImmutableMap;
1617
import com.google.common.util.concurrent.SimpleTimeLimiter;
1718
import io.airlift.log.Logger;
1819
import io.airlift.units.Duration;
@@ -39,7 +40,7 @@ public class ClusterStatsJdbcMonitor
3940
{
4041
private static final Logger log = Logger.get(ClusterStatsJdbcMonitor.class);
4142

42-
private final Properties properties; // TODO Avoid using a mutable field
43+
private final ImmutableMap<String, String> properties;
4344
private final Duration queryTimeout;
4445

4546
private static final String STATE_QUERY = "SELECT state, COUNT(*) as count "
@@ -49,15 +50,16 @@ public class ClusterStatsJdbcMonitor
4950

5051
public ClusterStatsJdbcMonitor(BackendStateConfiguration backendStateConfiguration, MonitorConfiguration monitorConfiguration)
5152
{
52-
properties = new Properties();
53-
properties.setProperty("user", backendStateConfiguration.getUsername());
54-
properties.setProperty("password", backendStateConfiguration.getPassword());
55-
properties.setProperty("SSL", String.valueOf(backendStateConfiguration.getSsl()));
53+
ImmutableMap.Builder<String, String> propertiesBuilder = ImmutableMap.builder();
54+
propertiesBuilder.put("user", backendStateConfiguration.getUsername());
55+
propertiesBuilder.put("password", backendStateConfiguration.getPassword());
56+
propertiesBuilder.put("SSL", String.valueOf(backendStateConfiguration.getSsl()));
5657
// explicitPrepare is a valid property for Trino versions >= 431. To avoid compatibility
5758
// issues with versions < 431, this property is left unset when explicitPrepare=true, which is the default
5859
if (!monitorConfiguration.isExplicitPrepare()) {
59-
properties.setProperty("explicitPrepare", "false");
60+
propertiesBuilder.put("explicitPrepare", "false");
6061
}
62+
properties = propertiesBuilder.build();
6163
queryTimeout = monitorConfiguration.getQueryTimeout();
6264
log.info("state check configured");
6365
}
@@ -68,23 +70,32 @@ public ClusterStats monitor(ProxyBackendConfiguration backend)
6870
String url = backend.getProxyTo();
6971
ClusterStats.Builder clusterStats = ClusterStatsMonitor.getClusterStatsBuilder(backend);
7072
String jdbcUrl;
73+
Properties connectionProperties;
7174
try {
7275
URL parsedUrl = new URL(url);
7376
jdbcUrl = String
7477
.format("jdbc:trino://%s:%s/system",
7578
parsedUrl.getHost(),
7679
parsedUrl.getPort() == -1 ? parsedUrl.getDefaultPort() : parsedUrl.getPort());
77-
// automatically set ssl config based on url protocol
78-
properties.setProperty("SSL", String.valueOf(parsedUrl.getProtocol().equals("https")));
80+
// Create connection properties from immutable map
81+
connectionProperties = new Properties();
82+
// Remove any existing SSL property to avoid confusion
83+
for (String key : properties.keySet()) {
84+
if (!key.equalsIgnoreCase("SSL")) {
85+
connectionProperties.setProperty(key, properties.get(key));
86+
}
87+
}
88+
// Set SSL config based on url protocol, always taking precedence
89+
connectionProperties.setProperty("SSL", String.valueOf(parsedUrl.getProtocol().equals("https")));
7990
}
8091
catch (MalformedURLException e) {
8192
throw new IllegalArgumentException("Invalid backend URL: " + url, e);
8293
}
8394

84-
try (Connection conn = DriverManager.getConnection(jdbcUrl, properties);
95+
try (Connection conn = DriverManager.getConnection(jdbcUrl, connectionProperties);
8596
PreparedStatement statement = SimpleTimeLimiter.create(Executors.newSingleThreadExecutor()).callWithTimeout(
8697
() -> conn.prepareStatement(STATE_QUERY), 10, SECONDS)) {
87-
statement.setString(1, (String) properties.get("user"));
98+
statement.setString(1, properties.get("user"));
8899
statement.setQueryTimeout((int) queryTimeout.roundTo(SECONDS));
89100
Map<String, Integer> partialState = new HashMap<>();
90101
ResultSet rs = statement.executeQuery();

gateway-ha/src/main/java/io/trino/gateway/ha/resource/GatewayWebAppResource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ public class GatewayWebAppResource
7878
private final ResourceGroupsManager resourceGroupsManager;
7979
private final boolean isRulesEngineEnabled;
8080
private final RulesType ruleType;
81-
// TODO Avoid putting mutable objects in fields
8281
private final UIConfiguration uiConfiguration;
8382
private final RoutingRulesManager routingRulesManager;
8483

@@ -95,7 +94,8 @@ public GatewayWebAppResource(
9594
this.queryHistoryManager = requireNonNull(queryHistoryManager, "queryHistoryManager is null");
9695
this.backendStateManager = requireNonNull(backendStateManager, "backendStateManager is null");
9796
this.resourceGroupsManager = requireNonNull(resourceGroupsManager, "resourceGroupsManager is null");
98-
this.uiConfiguration = configuration.getUiConfiguration();
97+
// UI configuration is immutable during application lifetime, no need to copy
98+
this.uiConfiguration = requireNonNull(configuration.getUiConfiguration(), "uiConfiguration is null");
9999
this.routingRulesManager = requireNonNull(routingRulesManager, "routingRulesManager is null");
100100
RoutingRulesConfiguration routingRules = configuration.getRoutingRules();
101101
isRulesEngineEnabled = routingRules.isRulesEngineEnabled();

0 commit comments

Comments
 (0)