Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
9fdae84
wip
aaron-congo Oct 21, 2025
8babd96
ci: scope down GitHub Token permissions (#1571)
AdnaneKhan Oct 21, 2025
9ce95e5
wip
aaron-congo Oct 22, 2025
b993e25
dialect cleanup wip
aaron-congo Oct 27, 2025
9df6e1d
wip
aaron-congo Oct 28, 2025
980ea01
Builds successfully
aaron-congo Oct 29, 2025
227eac9
Remove unnecessary classes
aaron-congo Oct 29, 2025
9332a7a
Fix messages
aaron-congo Oct 29, 2025
b5b7f5c
Move HostListProvider/HostListProviderService to hostlistprovider pac…
aaron-congo Oct 29, 2025
15c9a47
node -> instance, suggestedWriter -> writer
aaron-congo Oct 29, 2025
d021e00
Remove getWriterId from TopologyDialect
aaron-congo Oct 29, 2025
2cb200a
Revert "wip"
aaron-congo Oct 30, 2025
286e98c
Revert "wip"
aaron-congo Oct 30, 2025
6ae0b39
docs: Update integration testing guide to include a hint to do a clea…
QuChen88 Oct 30, 2025
c1ef2c0
Detailed cleanup
aaron-congo Oct 31, 2025
8098165
getHostListProvider -> getHostListProviderSupplier, RdsMultiAzDb -> M…
aaron-congo Oct 31, 2025
983722c
Checkstyle passing
aaron-congo Oct 31, 2025
3608e73
wip unit tests failing
aaron-congo Oct 31, 2025
73a9b87
Move TopologyUtils to hostlistprovider package
aaron-congo Oct 31, 2025
54aa632
add support of the following domains: eu, au, uk (#1587)
sergiyvamz Oct 31, 2025
da67081
RdsHostListProviderTest passing
aaron-congo Oct 31, 2025
c6e1957
Unit tests passing
aaron-congo Oct 31, 2025
bca6291
Fix integ tests
aaron-congo Oct 31, 2025
af99dab
Merge branch 'main' into host-list-provider-cleanup
aaron-congo Oct 31, 2025
292b05f
Merge branch 'main-3.x' into host-list-provider-cleanup
aaron-congo Oct 31, 2025
b4a4e4b
Global endpoints wip
aaron-congo Nov 3, 2025
6c7071d
build passing
aaron-congo Nov 4, 2025
faf4394
Adjusting for Global wip
aaron-congo Nov 4, 2025
58a456f
Build passing
aaron-congo Nov 5, 2025
66dc4fc
Fix formatting, error messages
aaron-congo Nov 5, 2025
0a537b3
Cleanup comments
aaron-congo Nov 5, 2025
29057d8
Add DialectUtils#checkExistenceQueries
aaron-congo Nov 5, 2025
e57bf03
Change getInstanceId return value from Pair to String
aaron-congo Nov 6, 2025
9ca3948
Unit tests passing
aaron-congo Nov 6, 2025
ce88de1
Merge branch 'main-3.x' into dialects-original
aaron-congo Nov 6, 2025
2e154f8
Cleanup
aaron-congo Nov 6, 2025
f890569
Update javadocs
aaron-congo Nov 6, 2025
56aa059
Revert "Change getInstanceId return value from Pair to String"
aaron-congo Nov 6, 2025
cd09a2d
cleanup
aaron-congo Nov 6, 2025
d0d49fe
Fix unit test
aaron-congo Nov 6, 2025
274ca55
Revert "ci: scope down GitHub Token permissions (#1571)"
aaron-congo Nov 6, 2025
5b748ad
Revert "add support of the following domains: eu, au, uk (#1587)"
aaron-congo Nov 6, 2025
b238463
Revert "chore: fix standard integration tests (#1594)"
aaron-congo Nov 6, 2025
a460ec6
ci: scope down GitHub Token permissions (#1571)
AdnaneKhan Oct 21, 2025
c0b3bd3
chore: fix standard integration tests (#1594)
sergiyvamz Nov 5, 2025
e885438
Fix Aurora dialect instance ID queries
aaron-congo Nov 6, 2025
2fab544
Fix bug where isWriterInstance didn't work properly
aaron-congo Nov 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
import software.amazon.jdbc.ConnectionPluginFactory;
import software.amazon.jdbc.ConnectionPluginManager;
import software.amazon.jdbc.ConnectionProvider;
import software.amazon.jdbc.HostListProviderService;
import software.amazon.jdbc.hostlistprovider.HostListProviderService;
import software.amazon.jdbc.HostSpec;
import software.amazon.jdbc.HostSpecBuilder;
import software.amazon.jdbc.JdbcMethod;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
import software.amazon.jdbc.ConnectionProviderManager;
import software.amazon.jdbc.Driver;
import software.amazon.jdbc.HikariPooledConnectionProvider;
import software.amazon.jdbc.HostListProviderService;
import software.amazon.jdbc.hostlistprovider.HostListProviderService;
import software.amazon.jdbc.HostSpec;
import software.amazon.jdbc.HostSpecBuilder;
import software.amazon.jdbc.JdbcMethod;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import java.util.Set;
import java.util.logging.Logger;
import software.amazon.jdbc.ConnectionPlugin;
import software.amazon.jdbc.HostListProviderService;
import software.amazon.jdbc.hostlistprovider.HostListProviderService;
import software.amazon.jdbc.HostRole;
import software.amazon.jdbc.HostSpec;
import software.amazon.jdbc.HostSpecBuilder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import java.util.Properties;
import org.checkerframework.checker.nullness.qual.NonNull;
import software.amazon.jdbc.ConnectionPluginManager;
import software.amazon.jdbc.HostListProviderService;
import software.amazon.jdbc.hostlistprovider.HostListProviderService;
import software.amazon.jdbc.PluginManagerService;
import software.amazon.jdbc.PluginService;
import software.amazon.jdbc.wrapper.ConnectionWrapper;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.sql.SQLException;
import java.util.List;
import java.util.concurrent.TimeoutException;
import software.amazon.jdbc.hostlistprovider.HostListProvider;

public interface BlockingHostListProvider extends HostListProvider {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import software.amazon.jdbc.hostlistprovider.HostListProviderService;

/**
* Interface for connection plugins. This class implements ways to execute a JDBC method and to clean up resources used
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import software.amazon.jdbc.cleanup.CanReleaseResources;
import software.amazon.jdbc.hostlistprovider.HostListProviderService;
import software.amazon.jdbc.plugin.AuroraConnectionTrackerPlugin;
import software.amazon.jdbc.plugin.AuroraInitialConnectionStrategyPlugin;
import software.amazon.jdbc.plugin.AwsSecretsManagerConnectionPlugin;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,14 @@
import software.amazon.jdbc.exceptions.ExceptionManager;
import software.amazon.jdbc.hostavailability.HostAvailability;
import software.amazon.jdbc.hostavailability.HostAvailabilityStrategyFactory;
import software.amazon.jdbc.hostlistprovider.HostListProvider;
import software.amazon.jdbc.hostlistprovider.HostListProviderService;
import software.amazon.jdbc.hostlistprovider.StaticHostListProvider;
import software.amazon.jdbc.profile.ConfigurationProfile;
import software.amazon.jdbc.states.SessionStateService;
import software.amazon.jdbc.targetdriverdialect.TargetDriverDialect;
import software.amazon.jdbc.util.FullServicesContainer;
import software.amazon.jdbc.util.LogUtils;
import software.amazon.jdbc.util.Messages;
import software.amazon.jdbc.util.Utils;
import software.amazon.jdbc.util.storage.CacheMap;
Expand Down Expand Up @@ -130,7 +133,7 @@ public PartialPluginService(
? this.configurationProfile.getExceptionHandler()
: null;

HostListProviderSupplier supplier = this.dbDialect.getHostListProvider();
HostListProviderSupplier supplier = this.dbDialect.getHostListProviderSupplier();
this.hostListProvider = supplier.getProvider(this.props, this.originalUrl, this.servicesContainer);
}

Expand All @@ -157,7 +160,7 @@ public HostSpec getCurrentHostSpec() {
Messages.get("PluginServiceImpl.currentHostNotAllowed",
new Object[] {
currentHostSpec == null ? "<null>" : currentHostSpec.getHostAndPort(),
Utils.logTopology(allowedHosts, "")})
LogUtils.logTopology(allowedHosts, "")})
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import software.amazon.jdbc.dialect.Dialect;
import software.amazon.jdbc.exceptions.ExceptionHandler;
import software.amazon.jdbc.hostavailability.HostAvailability;
import software.amazon.jdbc.hostlistprovider.HostListProvider;
import software.amazon.jdbc.states.SessionStateService;
import software.amazon.jdbc.targetdriverdialect.TargetDriverDialect;
import software.amazon.jdbc.util.telemetry.TelemetryFactory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,15 @@
import software.amazon.jdbc.exceptions.ExceptionManager;
import software.amazon.jdbc.hostavailability.HostAvailability;
import software.amazon.jdbc.hostavailability.HostAvailabilityStrategyFactory;
import software.amazon.jdbc.hostlistprovider.HostListProvider;
import software.amazon.jdbc.hostlistprovider.HostListProviderService;
import software.amazon.jdbc.hostlistprovider.StaticHostListProvider;
import software.amazon.jdbc.profile.ConfigurationProfile;
import software.amazon.jdbc.states.SessionStateService;
import software.amazon.jdbc.states.SessionStateServiceImpl;
import software.amazon.jdbc.targetdriverdialect.TargetDriverDialect;
import software.amazon.jdbc.util.FullServicesContainer;
import software.amazon.jdbc.util.LogUtils;
import software.amazon.jdbc.util.Messages;
import software.amazon.jdbc.util.Utils;
import software.amazon.jdbc.util.storage.CacheMap;
Expand Down Expand Up @@ -191,7 +194,7 @@ public HostSpec getCurrentHostSpec() {
Messages.get("PluginServiceImpl.currentHostNotAllowed",
new Object[] {
currentHostSpec == null ? "<null>" : currentHostSpec.getHostAndPort(),
Utils.logTopology(allowedHosts, "")})
LogUtils.logTopology(allowedHosts, "")})
);
}

Expand Down Expand Up @@ -707,7 +710,7 @@ public void updateDialect(final @NonNull Connection connection) throws SQLExcept
return;
}

final HostListProviderSupplier supplier = this.dialect.getHostListProvider();
final HostListProviderSupplier supplier = this.dialect.getHostListProviderSupplier();
this.setHostListProvider(supplier.getProvider(this.props, this.originalUrl, this.servicesContainer));
this.refreshHostList(connection);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,119 +17,85 @@
package software.amazon.jdbc.dialect;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import software.amazon.jdbc.PluginService;
import software.amazon.jdbc.hostlistprovider.AuroraHostListProvider;
import software.amazon.jdbc.hostlistprovider.AuroraTopologyUtils;
import software.amazon.jdbc.hostlistprovider.RdsHostListProvider;
import software.amazon.jdbc.hostlistprovider.TopologyUtils;
import software.amazon.jdbc.hostlistprovider.monitoring.MonitoringRdsHostListProvider;
import software.amazon.jdbc.plugin.failover2.FailoverConnectionPlugin;

public class AuroraMysqlDialect extends MysqlDialect implements BlueGreenDialect {
public class AuroraMysqlDialect extends MysqlDialect implements TopologyDialect, BlueGreenDialect {

protected final String topologyQuery =
protected static final String AURORA_VERSION_EXISTS_QUERY = "SHOW VARIABLES LIKE 'aurora_version'";
protected static final String TOPOLOGY_QUERY =
"SELECT SERVER_ID, CASE WHEN SESSION_ID = 'MASTER_SESSION_ID' THEN TRUE ELSE FALSE END, "
+ "CPU, REPLICA_LAG_IN_MILLISECONDS, LAST_UPDATE_TIMESTAMP "
+ "FROM information_schema.replica_host_status "
// filter out nodes that haven't been updated in the last 5 minutes
// filter out instances that have not been updated in the last 5 minutes
+ "WHERE time_to_sec(timediff(now(), LAST_UPDATE_TIMESTAMP)) <= 300 OR SESSION_ID = 'MASTER_SESSION_ID' ";

protected final String isWriterQuery =
protected static final String INSTANCE_ID_QUERY = "SELECT @@aurora_server_id, @@aurora_server_id";
protected static final String WRITER_ID_QUERY =
"SELECT SERVER_ID FROM information_schema.replica_host_status "
+ "WHERE SESSION_ID = 'MASTER_SESSION_ID' AND SERVER_ID = @@aurora_server_id";
+ "WHERE SESSION_ID = 'MASTER_SESSION_ID' AND SERVER_ID = @@aurora_server_id";
protected static final String IS_READER_QUERY = "SELECT @@innodb_read_only";

protected final String nodeIdQuery = "SELECT @@aurora_server_id, @@aurora_server_id";
protected final String isReaderQuery = "SELECT @@innodb_read_only";

private static final String BG_STATUS_QUERY =
"SELECT * FROM mysql.rds_topology";

private static final String TOPOLOGY_TABLE_EXIST_QUERY =
protected static final String BG_TOPOLOGY_EXISTS_QUERY =
"SELECT 1 AS tmp FROM information_schema.tables WHERE"
+ " table_schema = 'mysql' AND table_name = 'rds_topology'";
protected static final String BG_STATUS_QUERY = "SELECT * FROM mysql.rds_topology";

@Override
public boolean isDialect(final Connection connection) {
Statement stmt = null;
ResultSet rs = null;
try {
stmt = connection.createStatement();
rs = stmt.executeQuery("SHOW VARIABLES LIKE 'aurora_version'");
if (rs.next()) {
// If variable with such name is presented then it means it's an Aurora cluster
return true;
}
} catch (final SQLException ex) {
// ignore
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException ex) {
// ignore
}
}
if (rs != null) {
try {
rs.close();
} catch (SQLException ex) {
// ignore
}
}
}
return false;
return dialectUtils.checkExistenceQueries(connection, AURORA_VERSION_EXISTS_QUERY);
}

@Override
public List</* dialect code */ String> getDialectUpdateCandidates() {
return Arrays.asList(
DialectCodes.GLOBAL_AURORA_MYSQL,
DialectCodes.RDS_MULTI_AZ_MYSQL_CLUSTER);
return Collections.singletonList(DialectCodes.RDS_MULTI_AZ_MYSQL_CLUSTER);
}

@Override
public HostListProviderSupplier getHostListProvider() {
public HostListProviderSupplier getHostListProviderSupplier() {
return (properties, initialUrl, servicesContainer) -> {
final PluginService pluginService = servicesContainer.getPluginService();
final TopologyUtils topologyUtils = new AuroraTopologyUtils(this, pluginService.getHostSpecBuilder());
if (pluginService.isPluginInUse(FailoverConnectionPlugin.class)) {
return new MonitoringRdsHostListProvider(
properties,
initialUrl,
servicesContainer,
this.topologyQuery,
this.nodeIdQuery,
this.isReaderQuery,
this.isWriterQuery);
return new MonitoringRdsHostListProvider(topologyUtils, properties, initialUrl, servicesContainer);
}
return new AuroraHostListProvider(
properties,
initialUrl,
servicesContainer,
this.topologyQuery,
this.nodeIdQuery,
this.isReaderQuery);
return new RdsHostListProvider(topologyUtils, properties, initialUrl, servicesContainer);
};
}

@Override
public String getBlueGreenStatusQuery() {
return BG_STATUS_QUERY;
public String getTopologyQuery() {
return TOPOLOGY_QUERY;
}

@Override
public String getInstanceIdQuery() {
return INSTANCE_ID_QUERY;
}

@Override
public String getWriterIdQuery() {
return WRITER_ID_QUERY;
}

@Override
public String getIsReaderQuery() {
return IS_READER_QUERY;
}

@Override
public boolean isBlueGreenStatusAvailable(final Connection connection) {
try {
try (Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(TOPOLOGY_TABLE_EXIST_QUERY)) {
return rs.next();
}
} catch (SQLException ex) {
return false;
}
return dialectUtils.checkExistenceQueries(connection, BG_TOPOLOGY_EXISTS_QUERY);
}

@Override
public String getBlueGreenStatusQuery() {
return BG_STATUS_QUERY;
}
}

Loading
Loading