in wrapper/src/main/java/software/amazon/jdbc/plugin/AuroraInitialConnectionStrategyPlugin.java [170:245]
private Connection getVerifiedWriterConnection(
final Properties props,
final boolean isInitialConnection,
final JdbcCallable<Connection, SQLException> connectFunc)
throws SQLException {
final int retryDelayMs = OPEN_CONNECTION_RETRY_INTERVAL_MS.getInteger(props);
final long endTimeNano = this.getTime()
+ TimeUnit.MILLISECONDS.toNanos(OPEN_CONNECTION_RETRY_TIMEOUT_MS.getInteger(props));
Connection writerCandidateConn;
HostSpec writerCandidate;
while (this.getTime() < endTimeNano) {
writerCandidateConn = null;
writerCandidate = null;
try {
writerCandidate = this.getWriter();
if (writerCandidate == null || this.rdsUtils.isRdsClusterDns(writerCandidate.getHost())) {
// Writer is not found. It seems that topology is outdated.
writerCandidateConn = connectFunc.call();
this.pluginService.forceRefreshHostList(writerCandidateConn);
writerCandidate = this.pluginService.identifyConnection(writerCandidateConn);
if (writerCandidate == null || writerCandidate.getRole() != HostRole.WRITER) {
// Shouldn't be here. But let's try again.
this.closeConnection(writerCandidateConn);
this.delay(retryDelayMs);
continue;
}
if (isInitialConnection) {
hostListProviderService.setInitialConnectionHostSpec(writerCandidate);
}
return writerCandidateConn;
}
writerCandidateConn = this.pluginService.connect(writerCandidate, props, this);
if (this.pluginService.getHostRole(writerCandidateConn) != HostRole.WRITER) {
// If the new connection resolves to a reader instance, this means the topology is outdated.
// Force refresh to update the topology.
this.pluginService.forceRefreshHostList(writerCandidateConn);
this.closeConnection(writerCandidateConn);
this.delay(retryDelayMs);
continue;
}
// Writer connection is valid and verified.
if (isInitialConnection) {
hostListProviderService.setInitialConnectionHostSpec(writerCandidate);
}
return writerCandidateConn;
} catch (SQLException ex) {
this.closeConnection(writerCandidateConn);
if (this.pluginService.isLoginException(ex, this.pluginService.getTargetDriverDialect())) {
throw WrapperUtils.wrapExceptionIfNeeded(SQLException.class, ex);
} else {
if (writerCandidate != null) {
this.pluginService.setAvailability(writerCandidate.asAliases(), HostAvailability.NOT_AVAILABLE);
}
}
} catch (Throwable ex) {
this.closeConnection(writerCandidateConn);
throw ex;
}
}
return null;
}