public synchronized void updateAll() {
      HashSet<UpdatableNode> seenNodes = new HashSet<UpdatableNode>();

      // make a copy of _all, since UpdatableNode.update can add to it
      for (UpdatableNode node : new ArrayList<UpdatableNode>(_all)) {
        node.update(seenNodes);
      }

      if (seenNodes.size() > 0) {
        // not empty, means that at least 1 server gave node list
        // remove unused hosts
        Iterator<UpdatableNode> it = _all.iterator();
        while (it.hasNext()) {
          if (!seenNodes.contains(it.next())) it.remove();
        }
      }
    }