Skip to content

Commit d3ea939

Browse files
Feat(mysql-event-listener): Make startup failure behavior configurable
Add a new configuration key, `mysql-event-listener.terminate-on-initialization-failure`, to control how Trino behaves when the MySQL database is unreachable during startup. Previously, Trino would fail to start if MySQL was down. With this option, users can choose whether startup should fail or continue, improving resilience and flexibility in various deployment scenarios.
1 parent 6abf6a9 commit d3ea939

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

plugin/trino-mysql-event-listener/src/main/java/io/trino/plugin/eventlistener/mysql/MysqlEventListener.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public class MysqlEventListener
5050

5151
private static final long MAX_OPERATOR_SUMMARIES_JSON_LENGTH = 16 * 1024 * 1024;
5252

53+
private final MysqlEventListenerConfig config;
5354
private final QueryDao dao;
5455
private final JsonCodec<Set<String>> clientTagsJsonCodec;
5556
private final JsonCodec<Map<String, String>> sessionPropertiesJsonCodec;
@@ -59,13 +60,15 @@ public class MysqlEventListener
5960

6061
@Inject
6162
public MysqlEventListener(
63+
MysqlEventListenerConfig config,
6264
QueryDao dao,
6365
JsonCodec<Set<String>> clientTagsJsonCodec,
6466
JsonCodec<Map<String, String>> sessionPropertiesJsonCodec,
6567
JsonCodec<List<QueryInputMetadata>> inputsJsonCodec,
6668
JsonCodec<QueryOutputMetadata> outputJsonCodec,
6769
JsonCodec<List<TrinoWarning>> warningsJsonCodec)
6870
{
71+
this.config = requireNonNull(config, "config is null");
6972
this.dao = requireNonNull(dao, "dao is null");
7073
this.clientTagsJsonCodec = requireNonNull(clientTagsJsonCodec, "clientTagsJsonCodec is null");
7174
this.sessionPropertiesJsonCodec = requireNonNull(sessionPropertiesJsonCodec, "sessionPropertiesJsonCodec is null");
@@ -77,7 +80,18 @@ public MysqlEventListener(
7780
@PostConstruct
7881
public void createTable()
7982
{
80-
dao.createTable();
83+
try {
84+
dao.createTable();
85+
}
86+
catch (Exception e) {
87+
if (config.getTerminateOnInitializationFailure()) {
88+
throw e;
89+
}
90+
else {
91+
// Log the error but do not terminate, allowing the listener to continue functioning
92+
log.warn(e, "Unexpected error while creating MySQL event listener schema at startup. Ignoring error.");
93+
}
94+
}
8195
}
8296

8397
@Override

plugin/trino-mysql-event-listener/src/main/java/io/trino/plugin/eventlistener/mysql/MysqlEventListenerConfig.java

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

1616
import com.mysql.cj.jdbc.Driver;
1717
import io.airlift.configuration.Config;
18+
import io.airlift.configuration.ConfigDescription;
1819
import io.airlift.configuration.ConfigSecuritySensitive;
1920
import jakarta.validation.constraints.AssertTrue;
2021
import jakarta.validation.constraints.NotNull;
@@ -24,6 +25,7 @@
2425
public class MysqlEventListenerConfig
2526
{
2627
private String url;
28+
private boolean terminateOnInitializationFailure = true;
2729

2830
@NotNull
2931
public String getUrl()
@@ -49,4 +51,18 @@ public boolean isValidUrl()
4951
throw new RuntimeException(e);
5052
}
5153
}
54+
55+
@NotNull
56+
public boolean getTerminateOnInitializationFailure()
57+
{
58+
return terminateOnInitializationFailure;
59+
}
60+
61+
@ConfigDescription("MySQL event listener initialization might fail due to network issues reaching the MySQL server. This flag controls whether to throw an exception in such cases.")
62+
@Config("mysql-event-listener.terminate-on-initialization-failure")
63+
public MysqlEventListenerConfig setTerminateOnInitializationFailure(boolean terminateOnInitializationFailure)
64+
{
65+
this.terminateOnInitializationFailure = terminateOnInitializationFailure;
66+
return this;
67+
}
5268
}

plugin/trino-mysql-event-listener/src/test/java/io/trino/plugin/eventlistener/mysql/TestMysqlEventListenerConfig.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,20 @@ final class TestMysqlEventListenerConfig
2828
void testDefaults()
2929
{
3030
assertRecordedDefaults(recordDefaults(MysqlEventListenerConfig.class)
31-
.setUrl(null));
31+
.setUrl(null)
32+
.setTerminateOnInitializationFailure(true));
3233
}
3334

3435
@Test
3536
void testExplicitPropertyMappings()
3637
{
3738
Map<String, String> properties = Map.of(
38-
"mysql-event-listener.db.url", "jdbc:mysql://example.net:3306");
39+
"mysql-event-listener.db.url", "jdbc:mysql://example.net:3306",
40+
"mysql-event-listener.terminate-on-initialization-failure", "false");
3941

4042
MysqlEventListenerConfig expected = new MysqlEventListenerConfig()
41-
.setUrl("jdbc:mysql://example.net:3306");
43+
.setUrl("jdbc:mysql://example.net:3306")
44+
.setTerminateOnInitializationFailure(false);
4245

4346
assertFullMapping(properties, expected);
4447
}

0 commit comments

Comments
 (0)