From cda8646cfa65e283686e9ee97b99c31cc5a7b6cf Mon Sep 17 00:00:00 2001 From: Jason Darrell Lowe Date: Fri, 18 Apr 2014 19:24:13 +0000 Subject: [PATCH] YARN-1940. deleteAsUser() terminates early without deleting more files on error. Contributed by Rushabh S Shah git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1588546 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-yarn-project/CHANGES.txt | 3 +++ .../impl/container-executor.c | 20 +++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index b19578f99fc..c31b5fc75ed 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 4fc21cbc742..9387ba4f1e0 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;