in src/oomd/plugins/Senpai.cpp [85:141]
Engine::PluginRet Senpai::run(OomdContext& ctx) {
auto resolved_cgroups = ctx.reverseSort(
cgroups_,
[](const CgroupContext& cgroup_ctx) { return cgroup_ctx.id(); });
// Use reverse iterator after reverseSort to make it normal order
auto resolvedIt = resolved_cgroups.crbegin();
auto trackedIt = tracked_cgroups_.begin();
bool do_aggregate_log = false;
if (++log_ticks_ >= log_interval_) {
log_ticks_ = 0;
do_aggregate_log = true;
}
// Iterate both tracked cgroups and resolved cgroups in increasing id order
while (resolvedIt != resolved_cgroups.crend()) {
const CgroupContext& cgroup_ctx = *resolvedIt;
// Use id to identify CgroupContext across intervals, as path, dir_fd, and
// memory address could all be recycled upon cgroup recreation.
auto id_opt = cgroup_ctx.id();
if (!id_opt) {
continue;
}
if (trackedIt == tracked_cgroups_.end() || *id_opt < trackedIt->first) {
// Resolved cgroup not in tracked map, track it
// New cgroups will be polled after a "tick" has elapsed
if (auto new_cgroup_state_opt = initializeCgroup(cgroup_ctx)) {
tracked_cgroups_.emplace_hint(
trackedIt, *id_opt, *new_cgroup_state_opt);
}
++resolvedIt;
} else if (*cgroup_ctx.id() > trackedIt->first) {
trackedIt = tracked_cgroups_.erase(trackedIt);
} else {
bool tick_result = immediate_backoff_
? tick_immediate_backoff(cgroup_ctx, trackedIt->second)
: tick(cgroup_ctx, trackedIt->second);
if (do_aggregate_log && tick_result) {
auto& state = trackedIt->second;
std::ostringstream oss;
oss << "cgroup " << cgroup_ctx.cgroup().relativePath() << " "
<< state.probe_count << " probe attempts (" << std::setprecision(3)
<< std::fixed << state.probe_bytes / (double)(1 << 30UL) << " gb)";
OLOG << oss.str();
// Reset stats
state.probe_count = 0;
state.probe_bytes = 0;
}
// Keep the tracked cgroups if they are still valid after tick
trackedIt = tick_result ? std::next(trackedIt)
: tracked_cgroups_.erase(trackedIt);
++resolvedIt;
}
}
tracked_cgroups_.erase(trackedIt, tracked_cgroups_.end());
return Engine::PluginRet::CONTINUE;
}