in wrapper/src/main/java/software/amazon/jdbc/hostlistprovider/RdsHostListProvider.java [140:215]
protected void init() throws SQLException {
if (this.isInitialized) {
return;
}
lock.lock();
try {
if (this.isInitialized) {
return;
}
// initial topology is based on connection string
this.initialHostList =
connectionUrlParser.getHostsFromConnectionUrl(this.originalUrl, false,
this.hostListProviderService::getHostSpecBuilder);
if (this.initialHostList == null || this.initialHostList.isEmpty()) {
throw new SQLException(Messages.get("RdsHostListProvider.parsedListEmpty",
new Object[] {this.originalUrl}));
}
this.initialHostSpec = this.initialHostList.get(0);
this.hostListProviderService.setInitialConnectionHostSpec(this.initialHostSpec);
this.clusterId = UUID.randomUUID().toString();
this.isPrimaryClusterId = false;
this.refreshRateNano =
TimeUnit.MILLISECONDS.toNanos(CLUSTER_TOPOLOGY_REFRESH_RATE_MS.getInteger(properties));
HostSpecBuilder hostSpecBuilder = this.hostListProviderService.getHostSpecBuilder();
String clusterInstancePattern = CLUSTER_INSTANCE_HOST_PATTERN.getString(this.properties);
if (clusterInstancePattern != null) {
this.clusterInstanceTemplate =
ConnectionUrlParser.parseHostPortPair(clusterInstancePattern, () -> hostSpecBuilder);
} else {
this.clusterInstanceTemplate =
hostSpecBuilder
.host(rdsHelper.getRdsInstanceHostPattern(this.initialHostSpec.getHost()))
.hostId(this.initialHostSpec.getHostId())
.port(this.initialHostSpec.getPort())
.build();
}
validateHostPatternSetting(this.clusterInstanceTemplate.getHost());
this.rdsUrlType = rdsHelper.identifyRdsType(this.initialHostSpec.getHost());
final String clusterIdSetting = CLUSTER_ID.getString(this.properties);
if (!StringUtils.isNullOrEmpty(clusterIdSetting)) {
this.clusterId = clusterIdSetting;
} else if (rdsUrlType == RdsUrlType.RDS_PROXY) {
// Each proxy is associated with a single cluster, so it's safe to use RDS Proxy Url as cluster
// identification
this.clusterId = this.initialHostSpec.getUrl();
} else if (rdsUrlType.isRds()) {
final ClusterSuggestedResult clusterSuggestedResult =
getSuggestedClusterId(this.initialHostSpec.getHostAndPort());
if (clusterSuggestedResult != null && !StringUtils.isNullOrEmpty(clusterSuggestedResult.clusterId)) {
this.clusterId = clusterSuggestedResult.clusterId;
this.isPrimaryClusterId = clusterSuggestedResult.isPrimaryClusterId;
} else {
final String clusterRdsHostUrl =
rdsHelper.getRdsClusterHostUrl(this.initialHostSpec.getHost());
if (!StringUtils.isNullOrEmpty(clusterRdsHostUrl)) {
this.clusterId = this.clusterInstanceTemplate.isPortSpecified()
? String.format("%s:%s", clusterRdsHostUrl, this.clusterInstanceTemplate.getPort())
: clusterRdsHostUrl;
this.isPrimaryClusterId = true;
primaryClusterIdCache.put(this.clusterId, true, suggestedClusterIdRefreshRateNano);
}
}
}
this.isInitialized = true;
} finally {
lock.unlock();
}
}