in wrapper/src/main/java/software/amazon/jdbc/plugin/failover/ClusterAwareWriterFailoverHandler.java [243:300]
public WriterFailoverResult call() {
LOGGER.fine(
() -> Messages.get(
"ClusterAwareWriterFailoverHandler.taskAAttemptReconnectToWriterInstance",
new Object[] {this.originalWriterHost.getUrl(), PropertyUtils.maskProperties(initialConnectionProps)}));
Connection conn = null;
List<HostSpec> latestTopology = null;
boolean success = false;
try {
while (Utils.isNullOrEmpty(latestTopology)) {
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
conn = pluginService.forceConnect(this.originalWriterHost, initialConnectionProps);
pluginService.forceRefreshHostList(conn);
latestTopology = pluginService.getAllHosts();
} catch (final SQLException exception) {
// Propagate exceptions that are not caused by network errors.
if (!pluginService.isNetworkException(exception)) {
LOGGER.finer(
() -> Messages.get(
"ClusterAwareWriterFailoverHandler.taskAEncounteredException",
new Object[] {exception}));
return new WriterFailoverResult(false, false, null, null, "TaskA", exception);
}
}
if (Utils.isNullOrEmpty(latestTopology)) {
TimeUnit.MILLISECONDS.sleep(reconnectWriterIntervalMs);
}
}
success = isCurrentHostWriter(latestTopology);
LOGGER.finest("[TaskA] success: " + success);
pluginService.setAvailability(this.originalWriterHost.asAliases(), HostAvailability.AVAILABLE);
return new WriterFailoverResult(success, false, latestTopology, success ? conn : null, "TaskA");
} catch (final InterruptedException exception) {
Thread.currentThread().interrupt();
return new WriterFailoverResult(success, false, latestTopology, success ? conn : null, "TaskA");
} catch (final Exception ex) {
LOGGER.severe(() -> ex.getMessage());
return new WriterFailoverResult(false, false, null, null, "TaskA");
} finally {
try {
if (conn != null && !success && !conn.isClosed()) {
conn.close();
}
} catch (final Exception ex) {
// ignore
}
LOGGER.finer(Messages.get("ClusterAwareWriterFailoverHandler.taskAFinished"));
}
}