code: ClusterStatus generateClusterHealthReport() {
      ClusterStatus cs = new ClusterStatus();
      List<InetSocketAddress> isas = null;
      ArrayList<String> suffixes = null;
      if (isAvatar) {
        suffixes = new ArrayList<String>();
        suffixes.add("0"); suffixes.add("1");
      }
      try {
        cs.nnAddrs = isas = DFSUtil.getClientRpcAddresses(conf, suffixes);
      } catch (Exception e) {
        // Could not build cluster status
        cs.setError(e);
        LOG.error(e);
        return cs;
      }
      
      sort(isas);
      
      // Process each namenode and add it to ClusterStatus in parallel
      NameNodeStatusFetcher[] threads = new NameNodeStatusFetcher[isas.size()];
      for (int i = 0; i < isas.size(); i++) {
        threads[i] = new NameNodeStatusFetcher(isas.get(i));
        threads[i].start();
      }
      for (NameNodeStatusFetcher thread : threads) {
        try {
          thread.join();
          if (thread.e != null) {
            cs.addException(thread.isa.toString(), thread.e);
          }
          cs.addNamenodeStatus(thread.nn);
        } catch (InterruptedException ex) {
          LOG.warn(ex);
        }
      }
      return cs;
    }
docs: JSP helper function that generates cluster health report.  When
  encountering exception while getting Namenode status, the exception will
  be listed in the page with corresponding stack trace.