Repository: hadoop Updated Branches: refs/heads/branch-2.8 028f66b8a -> d02829541
HDFS-9472. concat() API does not give proper exception messages on ./reserved relative path (Rakesh R via umamahesh) (cherry picked from commit e363417e7b7abdd5d149f303f729ecf3e95ef8f3) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/d0282954 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/d0282954 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/d0282954 Branch: refs/heads/branch-2.8 Commit: d0282954144d7b0763fca8bb44aeebbc690e0392 Parents: 028f66b Author: Uma Mahesh <umamah...@apache.org> Authored: Thu Dec 10 23:55:29 2015 -0800 Committer: Uma Mahesh <umamah...@apache.org> Committed: Fri Dec 11 00:02:49 2015 -0800 ---------------------------------------------------------------------- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../hdfs/server/namenode/FSDirConcatOp.java | 24 ++++++++++++++++---- .../hdfs/server/namenode/TestHDFSConcat.java | 19 ++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/d0282954/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 0812d54..629d330 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -839,6 +839,9 @@ Release 2.8.0 - UNRELEASED HDFS-9527. The return type of FSNamesystem.getBlockCollection should be changed to INodeFile. (szetszwo) + HDFS-9472. concat() API does not give proper exception messages on ./reserved + relative path (Rakesh R via umamahesh) + OPTIMIZATIONS HDFS-8026. Trace FSOutputSummer#writeChecksumChunks rather than http://git-wip-us.apache.org/repos/asf/hadoop/blob/d0282954/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirConcatOp.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirConcatOp.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirConcatOp.java index 492994e..1885756 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirConcatOp.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirConcatOp.java @@ -49,14 +49,11 @@ class FSDirConcatOp { static HdfsFileStatus concat(FSDirectory fsd, String target, String[] srcs, boolean logRetryCache) throws IOException { - Preconditions.checkArgument(!target.isEmpty(), "Target file name is empty"); - Preconditions.checkArgument(srcs != null && srcs.length > 0, - "No sources given"); + validatePath(target, srcs); assert srcs != null; if (FSDirectory.LOG.isDebugEnabled()) { FSDirectory.LOG.debug("concat {} to {}", Arrays.toString(srcs), target); } - final INodesInPath targetIIP = fsd.getINodesInPath4Write(target); // write permission for the target FSPermissionChecker pc = null; @@ -86,6 +83,25 @@ class FSDirConcatOp { return fsd.getAuditFileInfo(targetIIP); } + private static void validatePath(String target, String[] srcs) + throws IOException { + Preconditions.checkArgument(!target.isEmpty(), "Target file name is empty"); + Preconditions.checkArgument(srcs != null && srcs.length > 0, + "No sources given"); + if (FSDirectory.isReservedRawName(target) + || FSDirectory.isReservedInodesName(target)) { + throw new IOException("Concat operation doesn't support " + + FSDirectory.DOT_RESERVED_STRING + " relative path : " + target); + } + for (String srcPath : srcs) { + if (FSDirectory.isReservedRawName(srcPath) + || FSDirectory.isReservedInodesName(srcPath)) { + throw new IOException("Concat operation doesn't support " + + FSDirectory.DOT_RESERVED_STRING + " relative path : " + srcPath); + } + } + } + private static void verifyTargetFile(FSDirectory fsd, final String target, final INodesInPath targetIIP) throws IOException { // check the target http://git-wip-us.apache.org/repos/asf/hadoop/blob/d0282954/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestHDFSConcat.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestHDFSConcat.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestHDFSConcat.java index ded0031..6dc0782 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestHDFSConcat.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestHDFSConcat.java @@ -503,4 +503,23 @@ public class TestHDFSConcat { assertEquals(blockSize * 2, dfs.getFileStatus(trg).getLen()); assertFalse(dfs.exists(src)); } + + @Test(timeout = 30000) + public void testConcatReservedRelativePaths() throws IOException { + String testPathDir = "/.reserved/raw/ezone"; + Path dir = new Path(testPathDir); + dfs.mkdirs(dir); + Path trg = new Path(testPathDir, "trg"); + Path src = new Path(testPathDir, "src"); + DFSTestUtil.createFile(dfs, trg, blockSize, REPL_FACTOR, 1); + DFSTestUtil.createFile(dfs, src, blockSize, REPL_FACTOR, 1); + try { + dfs.concat(trg, new Path[] { src }); + Assert.fail("Must throw Exception!"); + } catch (IOException e) { + String errMsg = "Concat operation doesn't support " + + FSDirectory.DOT_RESERVED_STRING + " relative path : " + trg; + GenericTestUtils.assertExceptionContains(errMsg, e); + } + } }