in foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/DiscoveryManager.java [88:142]
private void doTask() {
Map<String, Map<String, List<String>>> removed = new HashMap<>();
for (Entry<String, Map<String, Map<String, StatefulDiscoveryInstance>>> apps : allInstances.entrySet()) {
for (Entry<String, Map<String, StatefulDiscoveryInstance>> services : apps.getValue().entrySet()) {
boolean changed = false;
for (StatefulDiscoveryInstance instance : services.getValue().values()) {
// check isolated time
if (instance.getIsolationStatus() == IsolationStatus.ISOLATED &&
instance.getIsolatedTime() + instance.getIsolateDuration() < System.currentTimeMillis()) {
instance.setIsolationStatus(IsolationStatus.NORMAL);
changed = true;
}
// check ping status
if (System.currentTimeMillis() - instance.getPingSuccessTime() > 180_000L) {
boolean pingResult = ping.ping(instance);
if (pingResult && instance.getPingStatus() != PingStatus.OK) {
instance.setPingStatus(PingStatus.OK);
changed = true;
} else if (!pingResult && instance.getPingStatus() != PingStatus.FAIL) {
instance.setPingStatus(PingStatus.FAIL);
changed = true;
}
if (pingResult) {
instance.setPingSuccessTime(System.currentTimeMillis());
}
}
// check unused
if (instance.getHistoryStatus() == HistoryStatus.HISTORY) {
if (instance.getStatus() != MicroserviceInstanceStatus.UP ||
instance.getPingStatus() == PingStatus.FAIL ||
instance.getIsolationStatus() == IsolationStatus.ISOLATED) {
removed.computeIfAbsent(apps.getKey(), k -> new HashMap<>())
.computeIfAbsent(services.getKey(), k -> new ArrayList<>()).add(instance.getInstanceId());
}
}
}
if (changed) {
rebuildVersionCache(apps.getKey(), apps.getKey());
}
}
}
// remove unused
for (Entry<String, Map<String, List<String>>> apps : removed.entrySet()) {
for (Entry<String, List<String>> services : apps.getValue().entrySet()) {
for (String instance : services.getValue()) {
StatefulDiscoveryInstance removedInstance =
allInstances.get(apps.getKey()).get(services.getKey()).remove(instance);
LOGGER.info("Remove instance {}/{}/{}/{}/{}/{}/{}/{}",
apps.getKey(), services.getKey(), removedInstance.getRegistryName(),
instance, removedInstance.getHistoryStatus(),
removedInstance.getStatus(), removedInstance.getPingStatus(), removedInstance.getIsolationStatus());
}
}
}
}