Repository: hadoop Updated Branches: refs/heads/branch-2.8 b13bd0410 -> e3d586367
HDFS-9851. NameNode throws NPE when setPermission is called on a path that does not exist. Contributed by Brahma Reddy Battula. (cherry picked from commit 27e0681f28ee896ada163bbbc08fd44d113e7d15) (cherry picked from commit 463ec6fa8c7d4c925fdd62456b0d2621414ab7d7) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/e3d58636 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/e3d58636 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/e3d58636 Branch: refs/heads/branch-2.8 Commit: e3d5863677c5348f7a04292d83fd5658870b95bd Parents: b13bd04 Author: Akira Ajisaka <[email protected]> Authored: Wed Mar 2 14:43:03 2016 +0900 Committer: Akira Ajisaka <[email protected]> Committed: Wed Mar 2 14:44:04 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/e3d58636/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 35d0b03..f0586f9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -1932,6 +1932,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/e3d58636/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/e3d58636/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 3e57a6f..9ce244c 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/e3d58636/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 cf47fb1..b396762 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 @@ -3222,7 +3222,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/e3d58636/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 01398a0..cfa953b 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(); @@ -283,6 +284,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(); }
