diff options
author | Tom Deseyn <tom.deseyn@gmail.com> | 2017-08-21 20:56:32 +0200 |
---|---|---|
committer | Jan Vorlicek <janvorli@microsoft.com> | 2017-08-21 20:56:32 +0200 |
commit | fa01b864246bb588e5088be36dbfe3af833b266f (patch) | |
tree | fe0a2191ecafa79e113ac92154b04b500475e78d /src/gc | |
parent | fca2b735f4b5193dfbf7f8b5b8d36060d73a9967 (diff) | |
download | coreclr-fa01b864246bb588e5088be36dbfe3af833b266f.tar.gz coreclr-fa01b864246bb588e5088be36dbfe3af833b266f.tar.bz2 coreclr-fa01b864246bb588e5088be36dbfe3af833b266f.zip |
Support docker cgroup limits (#13488)
* Fix cgroup mountinfo parsing
The parsing would find the wrong '-' in lines like this:
354 347 0:28 /system.slice/docker-654dd7b6b8bbfe1739ae3309b471e95ccc82b3a3f56b7879f0a811d68b5c4e1d.scope /sys/fs/cgroup/cpuacct,cpu ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,cpuacct,cpu
* cgroup: don't append cgroup relative path for reading docker limits
Diffstat (limited to 'src/gc')
-rw-r--r-- | src/gc/unix/cgroup.cpp | 92 |
1 files changed, 39 insertions, 53 deletions
diff --git a/src/gc/unix/cgroup.cpp b/src/gc/unix/cgroup.cpp index 4721f09f86..992678b634 100644 --- a/src/gc/unix/cgroup.cpp +++ b/src/gc/unix/cgroup.cpp @@ -36,8 +36,8 @@ class CGroup public: CGroup() { - m_memory_cgroup_path = FindMemoryCgroupPath(); - m_cpu_cgroup_path = FindCpuCgroupPath(); + m_memory_cgroup_path = FindCgroupPath(&IsMemorySubsystem); + m_cpu_cgroup_path = FindCgroupPath(&IsCpuSubsystem); } ~CGroup() @@ -110,65 +110,45 @@ private: return strcmp("cpu", strTok) == 0; } - static char* FindMemoryCgroupPath(){ - char *memory_cgroup_path = nullptr; - char *memory_hierarchy_mount = nullptr; - char *mem_cgroup_path_relative_to_mount = nullptr; - - memory_hierarchy_mount = FindHierarchyMount(&IsMemorySubsystem); - if (memory_hierarchy_mount == nullptr) - goto done; - - mem_cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(&IsMemorySubsystem); - if (mem_cgroup_path_relative_to_mount == nullptr) - goto done; - - memory_cgroup_path = (char*)malloc(strlen(memory_hierarchy_mount) + strlen(mem_cgroup_path_relative_to_mount) + 1); - if (memory_cgroup_path == nullptr) - goto done; - - strcpy(memory_cgroup_path, memory_hierarchy_mount); - strcat(memory_cgroup_path, mem_cgroup_path_relative_to_mount); - - done: - free(memory_hierarchy_mount); - free(mem_cgroup_path_relative_to_mount); - return memory_cgroup_path; - } - - static char* FindCpuCgroupPath(){ - char *cpu_cgroup_path = nullptr; - char *cpu_hierarchy_mount = nullptr; - char *cpu_cgroup_path_relative_to_mount = nullptr; + static char* FindCgroupPath(bool (*is_subsystem)(const char *)){ + char *cgroup_path = nullptr; + char *hierarchy_mount = nullptr; + char *hierarchy_root = nullptr; + char *cgroup_path_relative_to_mount = nullptr; - cpu_hierarchy_mount = FindHierarchyMount(&IsCpuSubsystem); - if (cpu_hierarchy_mount == nullptr) + FindHierarchyMount(is_subsystem, &hierarchy_mount, &hierarchy_root); + if (hierarchy_mount == nullptr || hierarchy_root == nullptr) goto done; - cpu_cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(&IsCpuSubsystem); - if (cpu_cgroup_path_relative_to_mount == nullptr) + cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(is_subsystem); + if (cgroup_path_relative_to_mount == nullptr) goto done; - cpu_cgroup_path = (char*)malloc(strlen(cpu_hierarchy_mount) + strlen(cpu_cgroup_path_relative_to_mount) + 1); - if (cpu_cgroup_path == nullptr) + cgroup_path = (char*)malloc(strlen(hierarchy_mount) + strlen(cgroup_path_relative_to_mount) + 1); + if (cgroup_path == nullptr) goto done; - strcpy(cpu_cgroup_path, cpu_hierarchy_mount); - strcat(cpu_cgroup_path, cpu_cgroup_path_relative_to_mount); + strcpy(cgroup_path, hierarchy_mount); + // For a host cgroup, we need to append the relative path. + // In a docker container, the root and relative path are the same and we don't need to append. + if (strcmp(hierarchy_root, cgroup_path_relative_to_mount) != 0) + strcat(cgroup_path, cgroup_path_relative_to_mount); done: - free(cpu_hierarchy_mount); - free(cpu_cgroup_path_relative_to_mount); - return cpu_cgroup_path; + free(hierarchy_mount); + free(hierarchy_root); + free(cgroup_path_relative_to_mount); + return cgroup_path; } - static char* FindHierarchyMount(bool (*is_subsystem)(const char *)) + static void FindHierarchyMount(bool (*is_subsystem)(const char *), char** pmountpath, char** pmountroot) { char *line = nullptr; size_t lineLen = 0, maxLineLen = 0; char *filesystemType = nullptr; char *options = nullptr; char *mountpath = nullptr; + char *mountroot = nullptr; FILE *mountinfofile = fopen(PROC_MOUNTINFO_FILENAME, "r"); if (mountinfofile == nullptr) @@ -189,11 +169,11 @@ private: maxLineLen = lineLen; } - char* separatorChar = strchr(line, '-'); + char* separatorChar = strstr(line, " - "); // See man page of proc to get format for /proc/self/mountinfo file int sscanfRet = sscanf(separatorChar, - "- %s %*s %s", + " - %s %*s %s", filesystemType, options); if (sscanfRet != 2) @@ -213,16 +193,21 @@ private: mountpath = (char*)malloc(lineLen+1); if (mountpath == nullptr) goto done; + mountroot = (char*)malloc(lineLen+1); + if (mountroot == nullptr) + goto done; sscanfRet = sscanf(line, - "%*s %*s %*s %*s %s ", + "%*s %*s %*s %s %s ", + mountroot, mountpath); - if (sscanfRet != 1) - { - free(mountpath); - mountpath = nullptr; + if (sscanfRet != 2) assert(!"Failed to parse mount info file contents with sscanf."); - } + + // assign the output arguments and clear the locals so we don't free them. + *pmountpath = mountpath; + *pmountroot = mountroot; + mountpath = mountroot = nullptr; goto done; } strTok = strtok_r(nullptr, ",", &context); @@ -230,12 +215,13 @@ private: } } done: + free(mountpath); + free(mountroot); free(filesystemType); free(options); free(line); if (mountinfofile) fclose(mountinfofile); - return mountpath; } static char* FindCGroupPathForSubsystem(bool (*is_subsystem)(const char *)) |