You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by ay...@apache.org on 2021/09/15 17:37:47 UTC
[hadoop] branch trunk updated: HADOOP-17907. FileUtil#fullyDelete
deletes contents of sym-linked directory when symlink cannot be deleted
because of local fs fault (#3431). Contributed by Weihao Zheng.
This is an automated email from the ASF dual-hosted git repository.
ayushsaxena pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/hadoop.git
The following commit(s) were added to refs/heads/trunk by this push:
new 3aa76f7 HADOOP-17907. FileUtil#fullyDelete deletes contents of sym-linked directory when symlink cannot be deleted because of local fs fault (#3431). Contributed by Weihao Zheng.
3aa76f7 is described below
commit 3aa76f7e48c34a3f665ed2eb1ba633e983a81cd4
Author: Weihao Zheng <11...@users.noreply.github.com>
AuthorDate: Thu Sep 16 01:37:21 2021 +0800
HADOOP-17907. FileUtil#fullyDelete deletes contents of sym-linked directory when symlink cannot be deleted because of local fs fault (#3431). Contributed by Weihao Zheng.
Signed-off-by: Ayush Saxena <ay...@apache.org>
---
.../main/java/org/apache/hadoop/fs/FileUtil.java | 3 ++-
.../java/org/apache/hadoop/fs/TestFileUtil.java | 29 ++++++++++++++++++++++
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java
index aaa02fe..d0a66be 100644
--- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java
+++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java
@@ -58,6 +58,7 @@ import java.util.zip.ZipInputStream;
import org.apache.commons.collections.map.CaseInsensitiveMap;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.io.FileUtils;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.conf.Configuration;
@@ -182,7 +183,7 @@ public class FileUtil {
return true;
}
// handle nonempty directory deletion
- if (!fullyDeleteContents(dir, tryGrantPermissions)) {
+ if (!FileUtils.isSymlink(dir) && !fullyDeleteContents(dir, tryGrantPermissions)) {
return false;
}
return deleteImpl(dir, true);
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java
index 1ca1f24..3a88b73 100644
--- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java
@@ -447,6 +447,35 @@ public class TestFileUtil {
validateAndSetWritablePermissions(false, ret);
}
+
+ /**
+ * Tests if fullyDelete deletes symlink's content when deleting unremovable dir symlink.
+ * @throws IOException
+ */
+ @Test (timeout = 30000)
+ public void testFailFullyDeleteDirSymlinks() throws IOException {
+ File linkDir = new File(del, "tmpDir");
+ FileUtil.setWritable(del, false);
+ // Since tmpDir is symlink to tmp, fullyDelete(tmpDir) should not
+ // delete contents of tmp. See setupDirs for details.
+ boolean ret = FileUtil.fullyDelete(linkDir);
+ // fail symlink deletion
+ Assert.assertFalse(ret);
+ Assert.assertTrue(linkDir.exists());
+ Assert.assertEquals(5, del.list().length);
+ // tmp dir should exist
+ validateTmpDir();
+ // simulate disk recovers and turns good
+ FileUtil.setWritable(del, true);
+ ret = FileUtil.fullyDelete(linkDir);
+ // success symlink deletion
+ Assert.assertTrue(ret);
+ Assert.assertFalse(linkDir.exists());
+ Assert.assertEquals(4, del.list().length);
+ // tmp dir should exist
+ validateTmpDir();
+ }
+
/**
* Extend {@link File}. Same as {@link File} except for two things: (1) This
* treats file1Name as a very special file which is not delete-able
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org