std::optional CgroupContext::getEffectiveSwapUtilPct()

in src/oomd/CgroupContext.cpp [313:355]


std::optional<double> CgroupContext::getEffectiveSwapUtilPct(Error* err) const {
  if (cgroup_.isRoot()) {
    const auto& sys = ctx_.getSystemContext();
    if (sys.swaptotal == 0) {
      return 0;
    }
    return static_cast<double>(sys.swapused) /
        static_cast<double>(sys.swaptotal);
  }

  auto swap_max_opt = swap_max(err);
  if (!swap_max_opt) {
    return std::nullopt;
  }

  if (*swap_max_opt == 0) {
    return 0;
  }

  auto swap_usage_opt = swap_usage(err);
  if (!swap_usage_opt) {
    return std::nullopt;
  }

  auto local_util_pct =
      static_cast<double>(*swap_usage_opt) / static_cast<double>(*swap_max_opt);
  auto parent_cgroup = cgroup_.getParent();
  auto parent_ctx = ctx_.addToCacheAndGet(parent_cgroup);
  if (!parent_ctx) {
    if (err) {
      *err = Error::INVALID_CGROUP;
    }
    return std::nullopt;
  }

  if (auto parent_effective_swap_util_pct =
          parent_ctx->get().effective_swap_util_pct(err);
      !parent_effective_swap_util_pct) {
    return std::nullopt;
  } else {
    return std::max(*parent_effective_swap_util_pct, local_util_pct);
  }
}