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 <ayushsaxena@apache.org>
This commit is contained in:
parent
3ecaa39668
commit
3aa76f7e48
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue