HDFS-9851. NameNode throws NPE when setPermission is called on a path that does not exist. Contributed by Brahma Reddy Battula.

This commit is contained in:
Akira Ajisaka 2016-03-02 14:43:03 +09:00
parent e2ddf82469
commit 27e0681f28
5 changed files with 24 additions and 3 deletions

View File

@ -2974,6 +2974,9 @@ Release 2.7.3 - UNRELEASED
HDFS-9766. TestDataNodeMetrics#testDataNodeTimeSpend fails intermittently. HDFS-9766. TestDataNodeMetrics#testDataNodeTimeSpend fails intermittently.
(Xiao Chen via aajisaka) (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 Release 2.7.2 - 2016-01-25
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -32,6 +32,7 @@ import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos;
import org.apache.hadoop.hdfs.protocolPB.PBHelperClient; import org.apache.hadoop.hdfs.protocolPB.PBHelperClient;
import org.apache.hadoop.security.AccessControlException; import org.apache.hadoop.security.AccessControlException;
import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.List; import java.util.List;
@ -388,7 +389,7 @@ class FSDirXAttrOp {
private static void checkXAttrChangeAccess( private static void checkXAttrChangeAccess(
FSDirectory fsd, INodesInPath iip, XAttr xAttr, FSDirectory fsd, INodesInPath iip, XAttr xAttr,
FSPermissionChecker pc) FSPermissionChecker pc)
throws AccessControlException { throws AccessControlException, FileNotFoundException {
if (fsd.isPermissionEnabled() && xAttr.getNameSpace() == XAttr.NameSpace if (fsd.isPermissionEnabled() && xAttr.getNameSpace() == XAttr.NameSpace
.USER) { .USER) {
final INode inode = iip.getLastINode(); final INode inode = iip.getLastINode();

View File

@ -1547,7 +1547,11 @@ public class FSDirectory implements Closeable {
} }
void checkOwner(FSPermissionChecker pc, INodesInPath iip) 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); checkPermission(pc, iip, true, null, null, null, null);
} }

View File

@ -3344,7 +3344,7 @@ public class TestDFSShell {
fs.createSnapshot(reserved, "snap"); fs.createSnapshot(reserved, "snap");
fail("Can't create snapshot on /.reserved"); fail("Can't create snapshot on /.reserved");
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
assertTrue(e.getMessage().contains("Directory does not exist")); assertTrue(e.getMessage().contains("Directory/File does not exist"));
} }
cluster.shutdown(); cluster.shutdown();
} }

View File

@ -51,6 +51,7 @@ public class TestPermission {
final private static Path CHILD_DIR2 = new Path(ROOT_PATH, "child2"); 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_FILE1 = new Path(ROOT_PATH, "file1");
final private static Path CHILD_FILE2 = new Path(ROOT_PATH, "file2"); 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 int FILE_LEN = 100;
final private static Random RAN = new Random(); final private static Random RAN = new Random();
@ -270,6 +271,18 @@ public class TestPermission {
final Path RENAME_PATH = new Path("/foo/bar"); final Path RENAME_PATH = new Path("/foo/bar");
userfs.mkdirs(RENAME_PATH); userfs.mkdirs(RENAME_PATH);
assertTrue(canRename(userfs, RENAME_PATH, CHILD_DIR1)); 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 { } finally {
cluster.shutdown(); cluster.shutdown();
} }