SystemMaybe Fs::readIostatAt()

in src/oomd/util/Fs.cpp [685:720]


SystemMaybe<IOStat> Fs::readIostatAt(const DirFd& dirfd) {
  auto lines = readFileByLine(Fs::Fd::openat(dirfd, kIoStatFile));
  if (!lines) {
    return SYSTEM_ERROR(lines.error());
  }

  std::vector<DeviceIOStat> io_stat;
  io_stat.reserve(lines->size());

  for (const auto& line : *lines) {
    // format
    //
    // 0:0 rbytes=0 wbytes=0 rios=0 wios=0 dbytes=0 dios=0
    DeviceIOStat dev_io_stat;
    int major, minor;
    int ret = sscanf(
        line.c_str(),
        "%d:%d rbytes=%" SCNd64 " wbytes=%" SCNd64 " rios=%" SCNd64
        " wios=%" SCNd64 " dbytes=%" SCNd64 " dios=%" SCNd64 "\n",
        &major,
        &minor,
        &dev_io_stat.rbytes,
        &dev_io_stat.wbytes,
        &dev_io_stat.rios,
        &dev_io_stat.wios,
        &dev_io_stat.dbytes,
        &dev_io_stat.dios);

    if (ret != 8) {
      return SYSTEM_ERROR(EINVAL);
    }
    dev_io_stat.dev_id = std::to_string(major) + ":" + std::to_string(minor);
    io_stat.push_back(dev_io_stat);
  }
  return io_stat;
}