HDFS-10344. DistributedFileSystem#getTrashRoots should skip encryption zone that does not have .Trash. Contributed by Xiaoyu Yao.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/45a753cc Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/45a753cc Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/45a753cc Branch: refs/heads/HDFS-1312 Commit: 45a753ccf79d334513c7bc8f2b81c89a4697075d Parents: 4ee4e5c Author: Xiaoyu Yao <[email protected]> Authored: Mon May 2 19:30:47 2016 -0700 Committer: Xiaoyu Yao <[email protected]> Committed: Mon May 2 19:30:47 2016 -0700 ---------------------------------------------------------------------- .../hadoop/hdfs/DistributedFileSystem.java | 3 ++ .../apache/hadoop/hdfs/TestEncryptionZones.java | 38 ++++++++++++++++++++ 2 files changed, 41 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/45a753cc/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java index a3a8ba0..7a56265 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java @@ -2410,6 +2410,9 @@ public class DistributedFileSystem extends FileSystem { while (it.hasNext()) { Path ezTrashRoot = new Path(it.next().getPath(), FileSystem.TRASH_PREFIX); + if (!exists(ezTrashRoot)) { + continue; + } if (allUsers) { for (FileStatus candidate : listStatus(ezTrashRoot)) { if (exists(candidate.getPath())) { http://git-wip-us.apache.org/repos/asf/hadoop/blob/45a753cc/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java index c8d98ee..ce2befd 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java @@ -28,6 +28,7 @@ import java.net.URI; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; @@ -1442,6 +1443,43 @@ public class TestEncryptionZones { verifyShellDeleteWithTrash(shell, encFile); } + @Test(timeout = 120000) + public void testGetTrashRoots() throws Exception { + final HdfsAdmin dfsAdmin = + new HdfsAdmin(FileSystem.getDefaultUri(conf), conf); + Path ezRoot1 = new Path("/ez1"); + fs.mkdirs(ezRoot1); + dfsAdmin.createEncryptionZone(ezRoot1, TEST_KEY); + Path ezRoot2 = new Path("/ez2"); + fs.mkdirs(ezRoot2); + dfsAdmin.createEncryptionZone(ezRoot2, TEST_KEY); + Path ezRoot3 = new Path("/ez3"); + fs.mkdirs(ezRoot3); + dfsAdmin.createEncryptionZone(ezRoot3, TEST_KEY); + Collection<FileStatus> trashRootsBegin = fs.getTrashRoots(true); + assertEquals("Unexpected getTrashRoots result", 0, trashRootsBegin.size()); + + final Path encFile = new Path(ezRoot2, "encFile"); + final int len = 8192; + DFSTestUtil.createFile(fs, encFile, len, (short) 1, 0xFEED); + Configuration clientConf = new Configuration(conf); + clientConf.setLong(FS_TRASH_INTERVAL_KEY, 1); + FsShell shell = new FsShell(clientConf); + verifyShellDeleteWithTrash(shell, encFile); + + Collection<FileStatus> trashRootsDelete1 = fs.getTrashRoots(true); + assertEquals("Unexpected getTrashRoots result", 1, + trashRootsDelete1.size()); + + final Path nonEncFile = new Path("/nonEncFile"); + DFSTestUtil.createFile(fs, nonEncFile, len, (short) 1, 0xFEED); + verifyShellDeleteWithTrash(shell, nonEncFile); + + Collection<FileStatus> trashRootsDelete2 = fs.getTrashRoots(true); + assertEquals("Unexpected getTrashRoots result", 2, + trashRootsDelete2.size()); + } + private void verifyShellDeleteWithTrash(FsShell shell, Path path) throws Exception{ try { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
