Windows: Added `os::get_job_mem` to stout. This function sums the working set size for each process in a job object represented by the PID. The Windows API does not support this directly. Instead, the list of processes in a job object must be obtained, and then for each process, the memory usage must be queried.
Review: https://reviews.apache.org/r/63274 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/b81784d8 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/b81784d8 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/b81784d8 Branch: refs/heads/master Commit: b81784d8387e4cea7fde581527cc774ded36bd30 Parents: d11d6d2 Author: Andrew Schwartzmeyer <[email protected]> Authored: Wed Oct 18 15:30:50 2017 -0700 Committer: Andrew Schwartzmeyer <[email protected]> Committed: Thu Nov 30 15:54:53 2017 -0800 ---------------------------------------------------------------------- 3rdparty/stout/include/stout/windows/os.hpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/b81784d8/3rdparty/stout/include/stout/windows/os.hpp ---------------------------------------------------------------------- diff --git a/3rdparty/stout/include/stout/windows/os.hpp b/3rdparty/stout/include/stout/windows/os.hpp index b0b1b8d..3713eb6 100644 --- a/3rdparty/stout/include/stout/windows/os.hpp +++ b/3rdparty/stout/include/stout/windows/os.hpp @@ -18,10 +18,12 @@ #include <list> #include <map> #include <memory> +#include <numeric> #include <set> #include <string> #include <vector> +#include <stout/bytes.hpp> #include <stout/duration.hpp> #include <stout/none.hpp> #include <stout/nothing.hpp> @@ -846,6 +848,26 @@ inline Try<std::set<Process>> get_job_processes(pid_t pid) } +inline Try<Bytes> get_job_mem(pid_t pid) { + const Try<std::set<Process>> processes = os::get_job_processes(pid); + if (processes.isError()) { + return Error(processes.error()); + } + + return std::accumulate( + processes.get().cbegin(), + processes.get().cend(), + Bytes(0), + [](const Bytes& bytes, const Process& process) { + if (process.rss.isNone()) { + return bytes; + } + + return bytes + process.rss.get(); + }); +} + + // `set_job_cpu_limit` sets a CPU limit for the process represented by // `pid`, assuming it is assigned to a job object. This function will fail // otherwise. This limit is a hard cap enforced by the OS.
