Author: shv Date: Tue Jun 5 05:36:30 2012 New Revision: 1346242 URL: http://svn.apache.org/viewvc?rev=1346242&view=rev Log: MAPREDUCE-2651. Fix race condition in Linux task controller for job log directory creation. Contributed by Bharath Mundlapudi and Benoy Antony.
Modified: hadoop/common/branches/branch-0.22/mapreduce/CHANGES.txt hadoop/common/branches/branch-0.22/mapreduce/src/c++/task-controller/impl/task-controller.c Modified: hadoop/common/branches/branch-0.22/mapreduce/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.22/mapreduce/CHANGES.txt?rev=1346242&r1=1346241&r2=1346242&view=diff ============================================================================== --- hadoop/common/branches/branch-0.22/mapreduce/CHANGES.txt (original) +++ hadoop/common/branches/branch-0.22/mapreduce/CHANGES.txt Tue Jun 5 05:36:30 2012 @@ -47,6 +47,8 @@ Release 0.22.1 - Unreleased MAPREDUCE-2452. Moves the cancellation of delegation tokens to a separate thread. (Devaraj Das and Benoy Antony via shv) + MAPREDUCE-2651. Fix race condition in Linux task controller for + job log directory creation. (Bharath Mundlapudi and Benoy Antony via shv) Release 0.22.0 - 2011-11-29 Modified: hadoop/common/branches/branch-0.22/mapreduce/src/c++/task-controller/impl/task-controller.c URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.22/mapreduce/src/c%2B%2B/task-controller/impl/task-controller.c?rev=1346242&r1=1346241&r2=1346242&view=diff ============================================================================== --- hadoop/common/branches/branch-0.22/mapreduce/src/c++/task-controller/impl/task-controller.c (original) +++ hadoop/common/branches/branch-0.22/mapreduce/src/c++/task-controller/impl/task-controller.c Tue Jun 5 05:36:30 2012 @@ -538,9 +538,16 @@ int create_directory_for_user(const char uid_t user = geteuid(); gid_t group = getegid(); int ret = 0; - ret = change_effective_user(tt_uid, tt_gid); + uid_t root = 0; + + //This check is particularly required for c-based unit tests since + //tests run as a regular user. + if (getuid() == root) { + ret = change_effective_user(root, tt_gid); + } + if (ret == 0) { - if (mkdir(path, permissions) == 0) { + if (mkdir(path, permissions) == 0 || errno == EEXIST) { // need to reassert the group sticky bit if (chmod(path, permissions) != 0) { fprintf(LOGFILE, "Can't chmod %s to add the sticky bit - %s\n", @@ -549,21 +556,6 @@ int create_directory_for_user(const char } else if (change_owner(path, user, tt_gid) != 0) { ret = -1; } - } else if (errno == EEXIST) { - struct stat file_stat; - if (stat(path, &file_stat) != 0) { - fprintf(LOGFILE, "Can't stat directory %s - %s\n", path, - strerror(errno)); - ret = -1; - } else { - if (file_stat.st_uid != user || - file_stat.st_gid != tt_gid) { - fprintf(LOGFILE, "Directory %s owned by wrong user or group. " - "Expected %d:%d and found %d:%d.\n", - path, user, tt_gid, file_stat.st_uid, file_stat.st_gid); - ret = -1; - } - } } else { fprintf(LOGFILE, "Failed to create directory %s - %s\n", path, strerror(errno));