in wrapper/src/main/java/software/amazon/jdbc/plugin/efm2/MonitorImpl.java [248:335]
public void run() {
LOGGER.finest(() -> Messages.get(
"MonitorImpl.startMonitoringThread",
new Object[]{this.hostSpec.getHost()}));
try {
while (!this.stopped.get()) {
if (this.activeContexts.isEmpty() && !this.nodeUnhealthy) {
TimeUnit.NANOSECONDS.sleep(THREAD_SLEEP_NANO);
continue;
}
final long statusCheckStartTimeNano = this.getCurrentTimeNano();
final boolean isValid = this.checkConnectionStatus();
final long statusCheckEndTimeNano = this.getCurrentTimeNano();
this.updateNodeHealthStatus(isValid, statusCheckStartTimeNano, statusCheckEndTimeNano);
if (this.nodeUnhealthy) {
this.pluginService.setAvailability(this.hostSpec.asAliases(), HostAvailability.NOT_AVAILABLE);
}
final List<WeakReference<MonitorConnectionContext>> tmpActiveContexts = new ArrayList<>();
WeakReference<MonitorConnectionContext> monitorContextWeakRef;
while ((monitorContextWeakRef = this.activeContexts.poll()) != null) {
if (this.stopped.get()) {
break;
}
MonitorConnectionContext monitorContext = monitorContextWeakRef.get();
if (monitorContext == null) {
continue;
}
if (this.nodeUnhealthy) {
// Kill connection.
monitorContext.setNodeUnhealthy(true);
final Connection connectionToAbort = monitorContext.getConnection();
monitorContext.setInactive();
if (connectionToAbort != null) {
this.abortConnection(connectionToAbort);
this.abortedConnectionsCounter.inc();
}
} else if (monitorContext.isActive()) {
tmpActiveContexts.add(monitorContextWeakRef);
}
}
// activeContexts is empty now and tmpActiveContexts contains all yet active contexts
// Add active contexts back to the queue.
this.activeContexts.addAll(tmpActiveContexts);
long delayNano = this.failureDetectionIntervalNano - (statusCheckEndTimeNano - statusCheckStartTimeNano);
if (delayNano < THREAD_SLEEP_NANO) {
delayNano = THREAD_SLEEP_NANO;
}
TimeUnit.NANOSECONDS.sleep(delayNano);
}
} catch (final InterruptedException intEx) {
// do nothing
} catch (final Exception ex) {
// this should not be reached; log and exit thread
if (LOGGER.isLoggable(Level.FINEST)) {
LOGGER.log(
Level.FINEST,
Messages.get(
"MonitorImpl.exceptionDuringMonitoringStop",
new Object[]{this.hostSpec.getHost()}),
ex); // We want to print full trace stack of the exception.
}
} finally {
this.stopped.set(true);
if (this.monitoringConn != null) {
try {
this.monitoringConn.close();
} catch (final SQLException ex) {
// ignore
}
}
}
LOGGER.finest(() -> Messages.get(
"MonitorImpl.stopMonitoringThread",
new Object[]{this.hostSpec.getHost()}));
}