Browse Source

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.
svn merge --ignore-ancestry -c 1529555 ../../trunk/


git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2.1-beta@1529557 13f79535-47bb-0310-9956-ffa450edef68

Vinod Kumar Vavilapalli 11 years ago
parent
commit
3a6fb04582

+ 4 - 0
hadoop-yarn-project/CHANGES.txt

@@ -118,6 +118,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

+ 45 - 20
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) {
-    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;
-  }
+int create_log_dirs(const char *app_id, char * const * log_dirs) {
 
-  ////////////// 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) {
+    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,17 +931,33 @@ 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) {