in wrapper/src/main/java/software/amazon/jdbc/plugin/customendpoint/CustomEndpointMonitorImpl.java [113:203]
public void run() {
LOGGER.fine(
Messages.get(
"CustomEndpointMonitorImpl.startingMonitor",
new Object[] { this.customEndpointHostSpec.getHost() }));
try {
while (!this.stop.get() && !Thread.currentThread().isInterrupted()) {
try {
long start = System.nanoTime();
final Filter customEndpointFilter =
Filter.builder().name("db-cluster-endpoint-type").values("custom").build();
final DescribeDbClusterEndpointsResponse endpointsResponse =
this.rdsClient.describeDBClusterEndpoints(
(builder) ->
builder.dbClusterEndpointIdentifier(this.endpointIdentifier).filters(customEndpointFilter));
List<DBClusterEndpoint> endpoints = endpointsResponse.dbClusterEndpoints();
if (endpoints.size() != 1) {
List<String> endpointURLs =
endpoints.stream().map(DBClusterEndpoint::endpoint).collect(Collectors.toList());
LOGGER.warning(
Messages.get("CustomEndpointMonitorImpl.unexpectedNumberOfEndpoints",
new Object[] {
this.endpointIdentifier,
this.region.id(),
endpoints.size(),
endpointURLs
}
));
TimeUnit.NANOSECONDS.sleep(this.refreshRateNano);
continue;
}
CustomEndpointInfo endpointInfo = CustomEndpointInfo.fromDBClusterEndpoint(endpoints.get(0));
CustomEndpointInfo cachedEndpointInfo = customEndpointInfoCache.get(this.customEndpointHostSpec.getHost());
if (cachedEndpointInfo != null && cachedEndpointInfo.equals(endpointInfo)) {
long elapsedTime = System.nanoTime() - start;
long sleepDuration = Math.max(0, this.refreshRateNano - elapsedTime);
TimeUnit.NANOSECONDS.sleep(sleepDuration);
continue;
}
LOGGER.fine(
Messages.get(
"CustomEndpointMonitorImpl.detectedChangeInCustomEndpointInfo",
new Object[] {this.customEndpointHostSpec.getHost(), endpointInfo}));
// The custom endpoint info has changed, so we need to update the set of allowed/blocked hosts.
AllowedAndBlockedHosts allowedAndBlockedHosts;
if (STATIC_LIST.equals(endpointInfo.getMemberListType())) {
allowedAndBlockedHosts = new AllowedAndBlockedHosts(endpointInfo.getStaticMembers(), null);
} else {
allowedAndBlockedHosts = new AllowedAndBlockedHosts(null, endpointInfo.getExcludedMembers());
}
this.pluginService.setAllowedAndBlockedHosts(allowedAndBlockedHosts);
customEndpointInfoCache.put(
this.customEndpointHostSpec.getHost(), endpointInfo, CUSTOM_ENDPOINT_INFO_EXPIRATION_NANO);
this.infoChangedCounter.inc();
long elapsedTime = System.nanoTime() - start;
long sleepDuration = Math.max(0, this.refreshRateNano - elapsedTime);
TimeUnit.NANOSECONDS.sleep(sleepDuration);
} catch (InterruptedException e) {
throw e;
} catch (Exception e) {
// If the exception is not an InterruptedException, log it and continue monitoring.
LOGGER.log(Level.SEVERE,
Messages.get(
"CustomEndpointMonitorImpl.exception",
new Object[]{this.customEndpointHostSpec.getHost()}), e);
}
}
} catch (InterruptedException e) {
LOGGER.fine(
Messages.get(
"CustomEndpointMonitorImpl.interrupted",
new Object[]{ this.customEndpointHostSpec.getHost() }));
Thread.currentThread().interrupt();
} finally {
customEndpointInfoCache.remove(this.customEndpointHostSpec.getHost());
this.rdsClient.close();
LOGGER.fine(
Messages.get(
"CustomEndpointMonitorImpl.stoppedMonitor",
new Object[]{ this.customEndpointHostSpec.getHost() }));
}
}