Status KsckResults::PrintTo()

in src/kudu/tools/ksck_results.cc [213:316]


Status KsckResults::PrintTo(PrintMode mode, ostream& out) {
  if (mode == PrintMode::JSON_PRETTY || mode == PrintMode::JSON_COMPACT) {
    return PrintJsonTo(mode, out);
  }

  // First, report on the masters and master tablet.
  std::sort(master_summaries.begin(), master_summaries.end(), ServerByHealthComparator);
  RETURN_NOT_OK(PrintServerHealthSummaries(KsckServerType::MASTER,
                                           master_summaries,
                                           out));
  if (mode == PrintMode::PLAIN_FULL || master_consensus_conflict) {
    RETURN_NOT_OK(PrintConsensusMatrix(master_uuids,
                                       boost::none,
                                       master_consensus_state_map,
                                       out));
  }
  out << endl;

  RETURN_NOT_OK(PrintFlagTable(KsckServerType::MASTER,
                               master_summaries.size(),
                               master_flag_to_servers_map,
                               master_flag_tags_map,
                               out));
  if (!master_flag_to_servers_map.empty()) {
    out << endl;
  }

  // Then, on the health of the tablet servers.
  std::sort(tserver_summaries.begin(), tserver_summaries.end(), ServerByHealthComparator);
  RETURN_NOT_OK(PrintServerHealthSummaries(KsckServerType::TABLET_SERVER,
                                           tserver_summaries,
                                           out));
  if (!tserver_summaries.empty()) {
    out << endl;
  }

  RETURN_NOT_OK(PrintFlagTable(KsckServerType::TABLET_SERVER,
                               tserver_summaries.size(),
                               tserver_flag_to_servers_map,
                               tserver_flag_tags_map,
                               out));
  if (!tserver_flag_to_servers_map.empty()) {
    out << endl;
  }

  // Finally, in the "server section", print the version summary.
  RETURN_NOT_OK(PrintVersionTable(master_summaries, tserver_summaries, out));
  out << endl;

  // Then, on each tablet.
  RETURN_NOT_OK(PrintTabletSummaries(tablet_summaries, mode, out));

  // Then, summarize the tablets by table.
  // Sort the tables so unhealthy tables are easy to see at the bottom.
  std::sort(table_summaries.begin(), table_summaries.end(),
            [](const KsckTableSummary& left, const KsckTableSummary& right) {
              return std::make_pair(left.TableStatus() != KsckCheckResult::HEALTHY, left.name) <
                     std::make_pair(right.TableStatus() != KsckCheckResult::HEALTHY, right.name);
            });
  RETURN_NOT_OK(PrintTableSummaries(table_summaries, out));
  if (!table_summaries.empty()) {
    out << endl;
  }

  // Next, report on checksum scans.
  RETURN_NOT_OK(PrintChecksumResults(checksum_results, out));
  if (!checksum_results.tables.empty()) {
    out << endl;
  }

  // And, add a summary of all the things we checked.
  RETURN_NOT_OK(PrintTotalCounts(*this, out));
  out << endl;

  // Penultimately, print the warnings.
  if (!warning_messages.empty()) {
    out << "==================" << endl;
    out << "Warnings:" << endl;
    out << "==================" << endl;
    for (const auto& s : warning_messages) {
      out << s.message().ToString() << endl;
    }
    out << endl;
  }

  // Finally, print a summary of all errors.
  if (error_messages.empty()) {
    // All good.
    out << "OK" << endl;
  } else {
    // Something went wrong.
    out << "==================" << endl;
    out << "Errors:" << endl;
    out << "==================" << endl;
    for (const auto& s : error_messages) {
      out << s.ToString() << endl;
    }
    out << endl;
    out << "FAILED" << endl;
  }

  // Remember, we only return non-OK if printing failed, not if ksck checks failed.
  return Status::OK();
}