diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index b19578f99f..c31b5fc75e 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -68,6 +68,9 @@ Release 2.5.0 - UNRELEASED YARN-1784. TestContainerAllocation assumes CapacityScheduler. (Robert Kanter via kasha) + YARN-1940. deleteAsUser() terminates early without deleting more files on + error (Rushabh S Shah via jlowe) + Release 2.4.1 - UNRELEASED 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 4fc21cbc74..9387ba4f1e 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 @@ -1082,6 +1082,7 @@ static int delete_path(const char *full_path, FTS* tree = fts_open(paths, FTS_PHYSICAL | FTS_XDEV, NULL); FTSENT* entry = NULL; int ret = 0; + int ret_errno = 0; if (tree == NULL) { fprintf(LOGFILE, @@ -1099,7 +1100,13 @@ static int delete_path(const char *full_path, if (rmdir(entry->fts_accpath) != 0) { fprintf(LOGFILE, "Couldn't delete directory %s - %s\n", entry->fts_path, strerror(errno)); - exit_code = -1; + if (errno == EROFS) { + exit_code = -1; + } + // record the first errno + if (errno != ENOENT && ret_errno == 0) { + ret_errno = errno; + } } } break; @@ -1111,7 +1118,13 @@ static int delete_path(const char *full_path, if (unlink(entry->fts_accpath) != 0) { fprintf(LOGFILE, "Couldn't delete file %s - %s\n", entry->fts_path, strerror(errno)); - exit_code = -1; + if (errno == EROFS) { + exit_code = -1; + } + // record the first errno + if (errno != ENOENT && ret_errno == 0) { + ret_errno = errno; + } } break; @@ -1154,6 +1167,9 @@ static int delete_path(const char *full_path, } } ret = fts_close(tree); + if (ret_errno != 0) { + exit_code = -1; + } if (exit_code == 0 && ret != 0) { fprintf(LOGFILE, "Error in fts_close while deleting %s\n", full_path); exit_code = -1;