bool Senpai::tick_immediate_backoff()

in src/oomd/plugins/Senpai.cpp [551:614]


bool Senpai::tick_immediate_backoff(
    const CgroupContext& cgroup_ctx,
    CgroupState& state) {
  // Wait for interval to prevent making senpai too aggressive
  // May wait longer if pressures are too high
  if (state.ticks) {
    state.ticks--;
    return true;
  }

  auto validate_pressure_maybe = validatePressure(cgroup_ctx);
  if (!validate_pressure_maybe) {
    return false;
  }

  auto validate = *validate_pressure_maybe;
  if (swap_validation_) {
    auto validate_swap_maybe = validateSwap(cgroup_ctx);
    if (!validate_swap_maybe) {
      return false;
    }
    validate = validate && *validate_swap_maybe;
  }
  if (validate) {
    auto limit_min_bytes_opt = getLimitMinBytes(cgroup_ctx);
    if (!limit_min_bytes_opt) {
      return false;
    }
    auto current_opt = cgroup_ctx.current_usage();
    if (!current_opt) {
      return false;
    }
    if (*current_opt > *limit_min_bytes_opt) {
      int original_swappiness;
      if (modulate_swappiness_) {
        original_swappiness =
            cgroup_ctx.oomd_ctx().getSystemContext().swappiness;
        auto swappiness_factor_maybe = calculateSwappinessFactor(cgroup_ctx);
        if (!swappiness_factor_maybe) {
          return false;
        }
        Fs::setSwappiness(original_swappiness * (*swappiness_factor_maybe));
      }
      OOMD_SCOPE_EXIT {
        if (modulate_swappiness_) {
          Fs::setSwappiness(original_swappiness);
        }
      };

      // Reclaim slowly towards limit_min_bytes
      int64_t reclaim_size = (*current_opt - *limit_min_bytes_opt) * max_probe_;
      // Reclaim in number of 4k pages
      reclaim_size &= ~0xFFF;
      if (!reclaim(cgroup_ctx, reclaim_size)) {
        return false;
      }
      state.probe_count++;
      state.probe_bytes += reclaim_size;
      state.ticks = interval_;
    }
  }

  return true;
}