diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.c b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.c index 751949e..b748bcb 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.c +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.c @@ -45,6 +45,7 @@ #include #include #include +#include #ifndef HAVE_FCHMODAT #include "compat/fchmodat.h" @@ -2186,6 +2187,36 @@ void chown_dir_contents(const char *dir_path, uid_t uid, gid_t gid) { free(path_tmp); } +char* get_mount_path(const char* controller) { + struct mntent *ent; + FILE *aFile; + char *type = "cgroup"; + char *path = malloc(EXECUTOR_PATH_MAX); + path[0] = '\0'; + + aFile = setmntent("/proc/mounts", "r"); + if (aFile == NULL) { + perror("setmntent"); + exit(1); + } + ent = getmntent(aFile); + while (NULL != ent) { + if (strcmp(ent->mnt_type, type) == 0) { + char *opt = strtok(ent->mnt_opts, ","); + while(opt) { + if (strcmp(opt, controller) == 0) { + strcpy(path, ent->mnt_dir); + break; + } + opt = strtok(NULL, ","); + } + } + ent = getmntent(aFile); + } + endmntent(aFile); + return path; +} + /** * Mount a cgroup controller at the requested mount point and create * a hierarchy for the Hadoop NodeManager to manage. @@ -2222,7 +2253,11 @@ int mount_cgroup(const char *pair, const char *hierarchy) { controller, mount_path); } } - if (mount("none", mount_path, "cgroup", 0, controller) == 0) { + int rc = mount("none", mount_path, "cgroup", 0, controller); + if (rc == 0 || errno == EBUSY) { + if (errno == EBUSY) { + mount_path = get_mount_path(controller); + } char *buf = stpncpy(hier_path, mount_path, strlen(mount_path)); *buf++ = '/'; snprintf(buf, EXECUTOR_PATH_MAX - (buf - hier_path), "%s", hierarchy);