Skip to content

Commit b005207

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 b005207

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

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

Lines changed: 7 additions & 0 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;
@@ -38,6 +39,7 @@ public class ClusterStatsJdbcMonitor
3839
private static final Logger log = Logger.get(ClusterStatsJdbcMonitor.class);
3940

4041
private final Properties properties; // TODO Avoid using a mutable field
42+
private final Duration queryTimeout;
4143

4244
private static final String STATE_QUERY = "SELECT state, COUNT(*) as count "
4345
+ "FROM runtime.queries "
@@ -50,6 +52,10 @@ public ClusterStatsJdbcMonitor(BackendStateConfiguration backendStateConfigurati
5052
properties.setProperty("user", backendStateConfiguration.getUsername());
5153
properties.setProperty("password", backendStateConfiguration.getPassword());
5254
properties.setProperty("SSL", String.valueOf(backendStateConfiguration.getSsl()));
55+
if (!monitorConfiguration.isExplicitPrepare()) { //do not set property if true (default) to avoid issues with older Trinos
56+
properties.setProperty("explicitPrepare", "false");
57+
}
58+
queryTimeout = monitorConfiguration.getQueryTimeout();
5359
log.info("state check configured");
5460
}
5561

@@ -77,6 +83,7 @@ public ClusterStats monitor(ProxyBackendConfiguration backend)
7783
PreparedStatement statement = SimpleTimeLimiter.create(Executors.newSingleThreadExecutor()).callWithTimeout(
7884
() -> conn.prepareStatement(STATE_QUERY), 10, TimeUnit.SECONDS)) {
7985
statement.setString(1, (String) properties.get("user"));
86+
statement.setQueryTimeout((int)queryTimeout.toMillis()/1000);
8087
Map<String, Integer> partialState = new HashMap<>();
8188
ResultSet rs = statement.executeQuery();
8289
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 & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
*/
1414
package io.trino.gateway.ha.clustermonitor;
1515

16+
import com.google.common.collect.ImmutableMap;
1617
import io.airlift.http.client.HttpClientConfig;
1718
import io.airlift.http.client.jetty.JettyHttpClient;
19+
import io.airlift.units.Duration;
1820
import io.trino.gateway.ha.config.BackendStateConfiguration;
1921
import io.trino.gateway.ha.config.MonitorConfiguration;
2022
import io.trino.gateway.ha.config.ProxyBackendConfiguration;
@@ -58,6 +60,8 @@ void testHttpMonitor()
5860
@Test
5961
void testJdbcMonitor()
6062
{
63+
MonitorConfiguration monitorConfigurationWithTimeout = new MonitorConfiguration();
64+
monitorConfigurationWithTimeout.setQueryTimeout(Duration.valueOf("30s"));
6165
testClusterStatsMonitor(backendStateConfiguration -> new ClusterStatsJdbcMonitor(backendStateConfiguration, new MonitorConfiguration()));
6266
}
6367

0 commit comments

Comments
 (0)