Skip to content

Commit 69d1e4d

Browse files
committed
Add a timeout for the backend stats collection query.
Default the stats collection query to use EXECUTE IMMEDIATE by default, with the option to use explicit PREPARE if desired
1 parent 5e8d877 commit 69d1e4d

File tree

3 files changed

+41
-3
lines changed

3 files changed

+41
-3
lines changed

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import com.google.common.util.concurrent.SimpleTimeLimiter;
1717
import io.airlift.log.Logger;
18+
import io.airlift.units.Duration;
1819
import io.trino.gateway.ha.config.BackendStateConfiguration;
1920
import io.trino.gateway.ha.config.MonitorConfiguration;
2021
import io.trino.gateway.ha.config.ProxyBackendConfiguration;
@@ -29,15 +30,17 @@
2930
import java.util.Map;
3031
import java.util.Properties;
3132
import java.util.concurrent.Executors;
32-
import java.util.concurrent.TimeUnit;
3333
import java.util.concurrent.TimeoutException;
3434

35+
import static java.util.concurrent.TimeUnit.SECONDS;
36+
3537
public class ClusterStatsJdbcMonitor
3638
implements ClusterStatsMonitor
3739
{
3840
private static final Logger log = Logger.get(ClusterStatsJdbcMonitor.class);
3941

4042
private final Properties properties; // TODO Avoid using a mutable field
43+
private final Duration queryTimeout;
4144

4245
private static final String STATE_QUERY = "SELECT state, COUNT(*) as count "
4346
+ "FROM runtime.queries "
@@ -50,6 +53,12 @@ public ClusterStatsJdbcMonitor(BackendStateConfiguration backendStateConfigurati
5053
properties.setProperty("user", backendStateConfiguration.getUsername());
5154
properties.setProperty("password", backendStateConfiguration.getPassword());
5255
properties.setProperty("SSL", String.valueOf(backendStateConfiguration.getSsl()));
56+
// explicitPrepare is a valid property for Trino versions >= 431. To avoid compatibility
57+
// issues with versions < 431, this property is left unset when explicitPrepare=true, which is the default
58+
if (!monitorConfiguration.isExplicitPrepare()) {
59+
properties.setProperty("explicitPrepare", "false");
60+
}
61+
queryTimeout = monitorConfiguration.getQueryTimeout();
5362
log.info("state check configured");
5463
}
5564

@@ -75,8 +84,9 @@ public ClusterStats monitor(ProxyBackendConfiguration backend)
7584

7685
try (Connection conn = DriverManager.getConnection(jdbcUrl, properties);
7786
PreparedStatement statement = SimpleTimeLimiter.create(Executors.newSingleThreadExecutor()).callWithTimeout(
78-
() -> conn.prepareStatement(STATE_QUERY), 10, TimeUnit.SECONDS)) {
87+
() -> conn.prepareStatement(STATE_QUERY), 10, SECONDS)) {
7988
statement.setString(1, (String) properties.get("user"));
89+
statement.setQueryTimeout((int) queryTimeout.roundTo(SECONDS));
8090
Map<String, Integer> partialState = new HashMap<>();
8191
ResultSet rs = statement.executeQuery();
8292
while (rs.next()) {

gateway-ha/src/main/java/io/trino/gateway/ha/config/MonitorConfiguration.java

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

16+
import io.airlift.units.Duration;
1617
import io.trino.gateway.ha.clustermonitor.ActiveClusterMonitor;
1718

1819
public class MonitorConfiguration
@@ -21,6 +22,10 @@ public class MonitorConfiguration
2122

2223
private int retries;
2324

25+
private Duration queryTimeout = Duration.valueOf("10s");
26+
27+
private boolean explicitPrepare;
28+
2429
public MonitorConfiguration() {}
2530

2631
public int getTaskDelaySeconds()
@@ -42,4 +47,24 @@ public void setRetries(int retries)
4247
{
4348
this.retries = retries;
4449
}
50+
51+
public Duration getQueryTimeout()
52+
{
53+
return queryTimeout;
54+
}
55+
56+
public void setQueryTimeout(Duration queryTimeout)
57+
{
58+
this.queryTimeout = queryTimeout;
59+
}
60+
61+
public boolean isExplicitPrepare()
62+
{
63+
return explicitPrepare;
64+
}
65+
66+
public void setExplicitPrepare(boolean explicitPrepare)
67+
{
68+
this.explicitPrepare = explicitPrepare;
69+
}
4570
}

gateway-ha/src/test/java/io/trino/gateway/ha/clustermonitor/TestClusterStatsMonitor.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import io.airlift.http.client.HttpClientConfig;
1717
import io.airlift.http.client.jetty.JettyHttpClient;
18+
import io.airlift.units.Duration;
1819
import io.trino.gateway.ha.config.BackendStateConfiguration;
1920
import io.trino.gateway.ha.config.MonitorConfiguration;
2021
import io.trino.gateway.ha.config.ProxyBackendConfiguration;
@@ -58,7 +59,9 @@ void testHttpMonitor()
5859
@Test
5960
void testJdbcMonitor()
6061
{
61-
testClusterStatsMonitor(backendStateConfiguration -> new ClusterStatsJdbcMonitor(backendStateConfiguration, new MonitorConfiguration()));
62+
MonitorConfiguration monitorConfigurationWithTimeout = new MonitorConfiguration();
63+
monitorConfigurationWithTimeout.setQueryTimeout(Duration.valueOf("30s"));
64+
testClusterStatsMonitor(backendStateConfiguration -> new ClusterStatsJdbcMonitor(backendStateConfiguration, monitorConfigurationWithTimeout));
6265
}
6366

6467
@Test

0 commit comments

Comments
 (0)