HDFS-9851. NameNode throws NPE when setPermission is called on a path that does not exist. Contributed by Brahma Reddy Battula.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/27e0681f Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/27e0681f Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/27e0681f Branch: refs/heads/yarn-2877 Commit: 27e0681f28ee896ada163bbbc08fd44d113e7d15 Parents: e2ddf82 Author: Akira Ajisaka <aajis...@apache.org> Authored: Wed Mar 2 14:43:03 2016 +0900 Committer: Akira Ajisaka <aajis...@apache.org> Committed: Wed Mar 2 14:43:03 2016 +0900 ---------------------------------------------------------------------- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../hadoop/hdfs/server/namenode/FSDirXAttrOp.java | 3 ++- .../hadoop/hdfs/server/namenode/FSDirectory.java | 6 +++++- .../test/java/org/apache/hadoop/hdfs/TestDFSShell.java | 2 +- .../org/apache/hadoop/security/TestPermission.java | 13 +++++++++++++ 5 files changed, 24 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/27e0681f/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 a87ffe0..8be05bf 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -2974,6 +2974,9 @@ Release 2.7.3 - UNRELEASED HDFS-9766. TestDataNodeMetrics#testDataNodeTimeSpend fails intermittently. (Xiao Chen via aajisaka) + HDFS-9851. NameNode throws NPE when setPermission is called on a path that + does not exist. (Brahma Reddy Battula via aajisaka) + Release 2.7.2 - 2016-01-25 INCOMPATIBLE CHANGES http://git-wip-us.apache.org/repos/asf/hadoop/blob/27e0681f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirXAttrOp.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirXAttrOp.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirXAttrOp.java index 24d3360..d27cec5 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirXAttrOp.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirXAttrOp.java @@ -32,6 +32,7 @@ import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos; import org.apache.hadoop.hdfs.protocolPB.PBHelperClient; import org.apache.hadoop.security.AccessControlException; +import java.io.FileNotFoundException; import java.io.IOException; import java.util.EnumSet; import java.util.List; @@ -388,7 +389,7 @@ class FSDirXAttrOp { private static void checkXAttrChangeAccess( FSDirectory fsd, INodesInPath iip, XAttr xAttr, FSPermissionChecker pc) - throws AccessControlException { + throws AccessControlException, FileNotFoundException { if (fsd.isPermissionEnabled() && xAttr.getNameSpace() == XAttr.NameSpace .USER) { final INode inode = iip.getLastINode(); http://git-wip-us.apache.org/repos/asf/hadoop/blob/27e0681f/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java index a00591f..51b7747 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java @@ -1547,7 +1547,11 @@ public class FSDirectory implements Closeable { } void checkOwner(FSPermissionChecker pc, INodesInPath iip) - throws AccessControlException { + throws AccessControlException, FileNotFoundException { + if (iip.getLastINode() == null) { + throw new FileNotFoundException( + "Directory/File does not exist " + iip.getPath()); + } checkPermission(pc, iip, true, null, null, null, null); } http://git-wip-us.apache.org/repos/asf/hadoop/blob/27e0681f/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSShell.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSShell.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSShell.java index 0753ab8..41cd5c0 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSShell.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSShell.java @@ -3344,7 +3344,7 @@ public class TestDFSShell { fs.createSnapshot(reserved, "snap"); fail("Can't create snapshot on /.reserved"); } catch (FileNotFoundException e) { - assertTrue(e.getMessage().contains("Directory does not exist")); + assertTrue(e.getMessage().contains("Directory/File does not exist")); } cluster.shutdown(); } http://git-wip-us.apache.org/repos/asf/hadoop/blob/27e0681f/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/security/TestPermission.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/security/TestPermission.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/security/TestPermission.java index 27af49c..5a17bbc 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/security/TestPermission.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/security/TestPermission.java @@ -51,6 +51,7 @@ public class TestPermission { final private static Path CHILD_DIR2 = new Path(ROOT_PATH, "child2"); final private static Path CHILD_FILE1 = new Path(ROOT_PATH, "file1"); final private static Path CHILD_FILE2 = new Path(ROOT_PATH, "file2"); + final private static Path CHILD_FILE3 = new Path(ROOT_PATH, "file3"); final private static int FILE_LEN = 100; final private static Random RAN = new Random(); @@ -270,6 +271,18 @@ public class TestPermission { final Path RENAME_PATH = new Path("/foo/bar"); userfs.mkdirs(RENAME_PATH); assertTrue(canRename(userfs, RENAME_PATH, CHILD_DIR1)); + // test permissions on files that do not exist + assertFalse(userfs.exists(CHILD_FILE3)); + try { + userfs.setOwner(CHILD_FILE3, "foo", "bar"); + fail("setOwner should fail for non-exist file"); + } catch (java.io.FileNotFoundException ignored) { + } + try { + userfs.setPermission(CHILD_FILE3, new FsPermission((short) 0777)); + fail("setPermission should fail for non-exist file"); + } catch (java.io.FileNotFoundException ignored) { + } } finally { cluster.shutdown(); }