private void doTask()

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());
        }
      }
    }
  }