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 c9928f6..886b463 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 @@ -198,6 +198,26 @@ static int write_pid_to_cgroup_as_root(const char* cgroup_file, pid_t pid) { return 0; } +static int check_docker_exit_code(const char *docker_binary, const char *container_id) { + char docker_inspect_command[PATH_MAX]; + + snprintf(docker_inspect_command, PATH_MAX, + "%s inspect --format {{.State.ExitCode}} %s", + docker_binary, container_id); + + FILE* inspect_docker = popen(docker_inspect_command, "r"); + int exit_code = 0; + int res = fscanf (inspect_docker, "%d", &exit_code); + if (pclose (inspect_docker) != 0 || res <= 0) + { + exit_code = UNABLE_TO_EXECUTE_CONTAINER_SCRIPT; + } + + fprintf(LOGFILE, "Checking docker container's exit code : %d\n", exit_code); + + return exit_code; +} + /** * Write the pid of the current process into the pid file. * pid_file: Path to pid file where pid needs to be written to @@ -1306,16 +1326,23 @@ int launch_docker_container_as_user(const char * user, const char *app_id, fprintf(LOGFILE, "Writing to cgroup task files...\n"); // cgroups-based resource enforcement if (resources_key != NULL && ! strcmp(resources_key, "cgroups")) { - // write pid to cgroups - char* const* cgroup_ptr; - for (cgroup_ptr = resources_values; cgroup_ptr != NULL && - *cgroup_ptr != NULL; ++cgroup_ptr) { - if (strcmp(*cgroup_ptr, "none") != 0 && - write_pid_to_cgroup_as_root(*cgroup_ptr, pid) != 0) { - exit_code = WRITE_CGROUP_FAILED; - goto cleanup; - } - } + // write pid to cgroups + char* const* cgroup_ptr; + int docker_exit_code = 0; + for (cgroup_ptr = resources_values; cgroup_ptr != NULL && + *cgroup_ptr != NULL; ++cgroup_ptr) { + if (strcmp(*cgroup_ptr, "none") != 0 && + write_pid_to_cgroup_as_root(*cgroup_ptr, pid) != 0) { + docker_exit_code = check_docker_exit_code(docker_binary, container_id); + if (docker_exit_code != 0) { + exit_code = docker_exit_code; + goto cleanup; + } else { + exit_code = WRITE_CGROUP_FAILED; + goto cleanup; + } + } + } } // write pid to pidfile