in evcache-core/src/main/java/com/netflix/evcache/pool/EVCacheClientPool.java [1167:1253]
public void pingServers(Boolean bootTimeCheck) {
final long start = System.currentTimeMillis();
try {
final Map<ServerGroup, List<EVCacheClient>> allServers = getAllInstancesByZone();
for (Entry<ServerGroup, List<EVCacheClient>> entry : allServers.entrySet()) {
final List<EVCacheClient> listOfClients = entry.getValue();
for (EVCacheClient client : listOfClients) {
if (!bootTimeCheck) {
// Just log versions and continue if not a boot time check
try {
final Map<SocketAddress, String> versions = client.getVersions();
if (log.isDebugEnabled()) {
for (Entry<SocketAddress, String> vEntry : versions.entrySet()) {
log.debug("Host : {} Version : {}", vEntry.getKey(), vEntry.getValue());
}
}
continue;
} catch (Exception e) {
log.warn("Error getting versions for client: {}", client, e);
continue;
}
}
long startTime = System.currentTimeMillis();
long timeoutMs = 3000; // 3 seconds
boolean success = false;
while (System.currentTimeMillis() - startTime < timeoutMs && !success) {
try {
final Map<SocketAddress, String> versions = client.getVersions();
boolean allNodesOk = true;
for (Entry<SocketAddress, String> vEntry : versions.entrySet()) {
String version = vEntry.getValue();
if (!version.matches("\\d+\\.\\d+\\.\\d+")) {
allNodesOk = false;
log.warn("Node not ready or invalid version: {}, response: {}",
vEntry.getKey(), version);
break;
}
}
if (allNodesOk) {
if (log.isDebugEnabled()) {
for (Entry<SocketAddress, String> vEntry : versions.entrySet()) {
log.debug("Host : {} Version : {}", vEntry.getKey(), vEntry.getValue());
}
}
success = true;
break;
}
Thread.sleep(100); // 100ms delay between retries
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.warn("Interrupted while pinging servers for client: {}", client);
break;
} catch (Exception e) {
log.warn("Error while pinging server for client: {}", client, e);
try {
Thread.sleep(100);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
break;
}
}
}
if (!success && bootTimeCheck) {
log.warn("Failed to get valid version from client {} within timeout", client);
EVCacheMetricsFactory.getInstance().getCounter(EVCacheMetricsFactory.INTERNAL_PING_SERVER_FAILURES,tagList).increment();
}
}
}
if (duetClientPool != null) {
duetClientPool.pingServers(false);
}
} catch (Throwable t) {
log.warn("Error while pinging the servers", t);
EVCacheMetricsFactory.getInstance().getCounter(EVCacheMetricsFactory.INTERNAL_PING_SERVER_FAILURES,tagList).increment();
} finally {
EVCacheMetricsFactory.getInstance().getPercentileTimer(EVCacheMetricsFactory.INTERNAL_PING_SERVER, tagList, Duration.ofMillis(100)).record(System.currentTimeMillis() - start, TimeUnit.MILLISECONDS);
}
}