YARN-4459. container-executor should only kill process groups. Contributed by Jun Gong

(cherry picked from commit f0520a2c94a9052e9907847cd8381844285a7f5f)

Conflicts:

	hadoop-yarn-project/CHANGES.txt
This commit is contained in:
Jason Lowe 2016-05-25 21:56:50 +00:00
parent 07b702d9d5
commit 7fe08d762f
3 changed files with 8 additions and 51 deletions

View File

@ -30,6 +30,9 @@ Release 2.6.5 - UNRELEASED
YARN-4773. Log aggregation performs extraneous filesystem operations when
rolling log aggregation is disabled (Jun Gong via jlowe)
YARN-4459. container-executor should only kill process groups (Jun Gong
via jlowe)
Release 2.6.4 - 2016-02-11
INCOMPATIBLE CHANGES

View File

@ -1159,21 +1159,13 @@ int signal_container_as_user(const char *user, int pid, int sig) {
}
//Don't continue if the process-group is not alive anymore.
int has_group = 1;
if (kill(-pid,0) < 0) {
if (kill(pid, 0) < 0) {
if (errno == ESRCH) {
return INVALID_CONTAINER_PID;
}
fprintf(LOGFILE, "Error signalling container %d with %d - %s\n",
pid, sig, strerror(errno));
return -1;
} else {
has_group = 0;
}
fprintf(LOGFILE, "Error signalling not exist process group %d "
"with signal %d\n", pid, sig);
return INVALID_CONTAINER_PID;
}
if (kill((has_group ? -1 : 1) * pid, sig) < 0) {
if (kill(-pid, sig) < 0) {
if(errno != ESRCH) {
fprintf(LOGFILE,
"Error signalling process group %d with signal %d - %s\n",
@ -1187,8 +1179,7 @@ int signal_container_as_user(const char *user, int pid, int sig) {
return INVALID_CONTAINER_PID;
}
}
fprintf(LOGFILE, "Killing process %s%d with %d\n",
(has_group ? "group " :""), pid, sig);
fprintf(LOGFILE, "Killing process group %d with %d\n", pid, sig);
return 0;
}

View File

@ -431,42 +431,6 @@ void run_test_in_child(const char* test_name, void (*func)()) {
}
}
void test_signal_container() {
printf("\nTesting signal_container\n");
fflush(stdout);
fflush(stderr);
pid_t child = fork();
if (child == -1) {
printf("FAIL: fork failed\n");
exit(1);
} else if (child == 0) {
if (change_user(user_detail->pw_uid, user_detail->pw_gid) != 0) {
exit(1);
}
sleep(3600);
exit(0);
} else {
printf("Child container launched as %d\n", child);
if (signal_container_as_user(yarn_username, child, SIGQUIT) != 0) {
exit(1);
}
int status = 0;
if (waitpid(child, &status, 0) == -1) {
printf("FAIL: waitpid failed - %s\n", strerror(errno));
exit(1);
}
if (!WIFSIGNALED(status)) {
printf("FAIL: child wasn't signalled - %d\n", status);
exit(1);
}
if (WTERMSIG(status) != SIGQUIT) {
printf("FAIL: child was killed with %d instead of %d\n",
WTERMSIG(status), SIGQUIT);
exit(1);
}
}
}
void test_signal_container_group() {
printf("\nTesting group signal_container\n");
fflush(stdout);
@ -782,7 +746,6 @@ int main(int argc, char **argv) {
// the tests that change user need to be run in a subshell, so that
// when they change user they don't give up our privs
run_test_in_child("test_signal_container", test_signal_container);
run_test_in_child("test_signal_container_group", test_signal_container_group);
// init app and run container can't be run if you aren't testing as root