From 52b0ce35655b33d81132bd53b8c28e993cc8bfa9 Mon Sep 17 00:00:00 2001 From: Vinod Kumar Vavilapalli Date: Sun, 6 Oct 2013 00:14:55 +0000 Subject: [PATCH] YARN-1274. Fixed NodeManager's LinuxContainerExecutor to create user, app-dir and log-dirs correctly even when there are no resources to localize for the container. Contributed by Siddharth Seth. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1529555 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-yarn-project/CHANGES.txt | 4 ++ .../impl/container-executor.c | 65 +++++++++++++------ 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 73b48a164f6..dff651395ad 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -184,6 +184,10 @@ Release 2.1.2 - UNRELEASED YARN-1090. Fixed CS UI to better reflect applications as non-schedulable and not as pending. (Jian He via acmurthy) + YARN-1274. Fixed NodeManager's LinuxContainerExecutor to create user, app-dir + and log-dirs correctly even when there are no resources to localize for the + container. (Siddharth Seth via vinodkv) + Release 2.1.1-beta - 2013-09-23 INCOMPATIBLE CHANGES 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 d5d894d42da..4fc21cbc742 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 @@ -751,28 +751,11 @@ int initialize_user(const char *user, char* const* local_dirs) { return failed ? INITIALIZE_USER_FAILED : 0; } -/** - * Function to prepare the application directories for the container. - */ -int initialize_app(const char *user, const char *app_id, - const char* nmPrivate_credentials_file, - char* const* local_dirs, char* const* log_roots, - char* const* args) { - if (app_id == NULL || user == NULL || user_detail == NULL || user_detail->pw_name == NULL) { - fprintf(LOGFILE, "Either app_id is null or the user passed is null.\n"); - return INVALID_ARGUMENT_NUMBER; - } +int create_log_dirs(const char *app_id, char * const * log_dirs) { - // create the user directory on all disks - int result = initialize_user(user, local_dirs); - if (result != 0) { - return result; - } - - ////////////// create the log directories for the app on all disks char* const* log_root; char *any_one_app_log_dir = NULL; - for(log_root=log_roots; *log_root != NULL; ++log_root) { + for(log_root=log_dirs; *log_root != NULL; ++log_root) { char *app_log_dir = get_app_log_directory(*log_root, app_id); if (app_log_dir == NULL) { // try the next one @@ -791,7 +774,33 @@ int initialize_app(const char *user, const char *app_id, return -1; } free(any_one_app_log_dir); - ////////////// End of creating the log directories for the app on all disks + return 0; +} + + +/** + * Function to prepare the application directories for the container. + */ +int initialize_app(const char *user, const char *app_id, + const char* nmPrivate_credentials_file, + char* const* local_dirs, char* const* log_roots, + char* const* args) { + if (app_id == NULL || user == NULL || user_detail == NULL || user_detail->pw_name == NULL) { + fprintf(LOGFILE, "Either app_id is null or the user passed is null.\n"); + return INVALID_ARGUMENT_NUMBER; + } + + // create the user directory on all disks + int result = initialize_user(user, local_dirs); + if (result != 0) { + return result; + } + + // create the log directories for the app on all disks + int log_create_result = create_log_dirs(app_id, log_roots); + if (log_create_result != 0) { + return log_create_result; + } // open up the credentials file int cred_file = open_file_as_nm(nmPrivate_credentials_file); @@ -922,18 +931,34 @@ int launch_container_as_user(const char *user, const char *app_id, } } + // create the user directory on all disks + int result = initialize_user(user, local_dirs); + if (result != 0) { + return result; + } + + // initializing log dirs + int log_create_result = create_log_dirs(app_id, log_dirs); + if (log_create_result != 0) { + return log_create_result; + } + // give up root privs if (change_user(user_detail->pw_uid, user_detail->pw_gid) != 0) { exit_code = SETUID_OPER_FAILED; goto cleanup; } + // Create container specific directories as user. If there are no resources + // to localize for this container, app-directories and log-directories are + // also created automatically as part of this call. if (create_container_directories(user, app_id, container_id, local_dirs, log_dirs, work_dir) != 0) { fprintf(LOGFILE, "Could not create container dirs"); goto cleanup; } + // 700 if (copy_file(container_file_source, script_name, script_file_dest,S_IRWXU) != 0) { goto cleanup;