Taking CT ID from /proc/<pid>/cgroup is not reliable. For instance when "shutdown" in called inside CT, CTs init has the following cgroup content:
root@skinsbursky-vz7:~/stub_proxy_fs# cat /proc/397761/cgroup 16:perf_event:/ 15:cpuset:/ 14:hugetlb:/ 13:pids:/ 10:ve:/ 8:devices:/ 7:freezer:/ 6:net_prio,net_cls:/ 5:cpuacct,cpu:/ 4:name=systemd:/ 3:beancounter:/ 2:memory:/ 1:blkio:/ This is because process exits cgroups before killing all it's descendants. This leads to failing "cg_env_check_init_pid" (processes "CT ID" doesn't match cached CT ID), leading in turn to skipping SUNRPC suppress, thus breaking CT killing with unreachable NFS. This patch changes the logic to take envID from /proc/pid/status, which contains real VE ID, but not cgroup. https://jira.sw.ru/browse/PSBM-70402 Signed-off-by: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com> --- lib/cgroup.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/cgroup.c b/lib/cgroup.c index 843e197..cb521b6 100644 --- a/lib/cgroup.c +++ b/lib/cgroup.c @@ -798,11 +798,11 @@ int cg_env_set_net_classid(const char *ctid, unsigned int classid) static int cg_env_check_init_pid(const char *ctid, pid_t pid) { - int ret, n; + int ret; FILE *fp; char buf[4096]; - snprintf(buf, sizeof(buf), "/proc/%d/cgroup", pid); + snprintf(buf, sizeof(buf), "/proc/%d/status", pid); fp = fopen(buf, "r"); if (fp == NULL) { if (errno == ENOENT) @@ -813,7 +813,7 @@ static int cg_env_check_init_pid(const char *ctid, pid_t pid) ret = 1; while (fgets(buf, sizeof(buf), fp)) { - if (sscanf(buf, "%d:ve:/%s", &n, buf) != 2) + if (sscanf(buf, "envID: %s", buf) != 1) continue; if (!strcmp(ctid, buf)) _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel