HDFS-4784. NPE in FSDirectory.resolvePath(). Contributed by Brandon Li.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1478276 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Suresh Srinivas 2013-05-02 06:02:12 +00:00
parent 03ba436d42
commit a4bae51b7d
3 changed files with 23 additions and 6 deletions

View File

@ -273,6 +273,8 @@ Trunk (Unreleased)
HDFS-4785. Concat operation does not remove concatenated files from HDFS-4785. Concat operation does not remove concatenated files from
InodeMap. (suresh) InodeMap. (suresh)
HDFS-4784. NPE in FSDirectory.resolvePath(). (Brandon Li via suresh)
BREAKDOWN OF HADOOP-8562 and HDFS-3602 SUBTASKS AND RELATED JIRAS BREAKDOWN OF HADOOP-8562 and HDFS-3602 SUBTASKS AND RELATED JIRAS
HDFS-4145. Merge hdfs cmd line scripts from branch-1-win. (David Lao, HDFS-4145. Merge hdfs cmd line scripts from branch-1-win. (David Lao,

View File

@ -1090,7 +1090,7 @@ int unprotectedDelete(String src, BlocksMapUpdateInfo collectedBlocks,
NameNode.stateChangeLog.debug("DIR* FSDirectory.unprotectedDelete: " NameNode.stateChangeLog.debug("DIR* FSDirectory.unprotectedDelete: "
+src+" is removed"); +src+" is removed");
} }
remvoedAllFromInodesFromMap(targetNode); removeAllFromInodesFromMap(targetNode);
return filesRemoved; return filesRemoved;
} }
@ -1783,14 +1783,14 @@ private final void removeFromInodeMap(INode inode) {
} }
/** Remove all the inodes under given inode from the map */ /** Remove all the inodes under given inode from the map */
private void remvoedAllFromInodesFromMap(INode inode) { private void removeAllFromInodesFromMap(INode inode) {
removeFromInodeMap(inode); removeFromInodeMap(inode);
if (!inode.isDirectory()) { if (!inode.isDirectory()) {
return; return;
} }
INodeDirectory dir = (INodeDirectory) inode; INodeDirectory dir = (INodeDirectory) inode;
for (INode child : dir.getChildrenList()) { for (INode child : dir.getChildrenList()) {
remvoedAllFromInodesFromMap(child); removeAllFromInodesFromMap(child);
} }
dir.clearChildren(); dir.clearChildren();
} }
@ -2258,14 +2258,18 @@ static String resolvePath(String src, byte[][] pathComponents, FSDirectory fsd)
try { try {
id = Long.valueOf(inodeId); id = Long.valueOf(inodeId);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
throw new FileNotFoundException( throw new FileNotFoundException("Invalid inode path: " + src);
"File for given inode path does not exist: " + src);
} }
if (id == INodeId.ROOT_INODE_ID && pathComponents.length == 4) { if (id == INodeId.ROOT_INODE_ID && pathComponents.length == 4) {
return Path.SEPARATOR; return Path.SEPARATOR;
} }
INode inode = fsd.getInode(id);
if (inode == null) {
throw new FileNotFoundException(
"File for given inode path does not exist: " + src);
}
StringBuilder path = id == INodeId.ROOT_INODE_ID ? new StringBuilder() StringBuilder path = id == INodeId.ROOT_INODE_ID ? new StringBuilder()
: new StringBuilder(fsd.getInode(id).getFullPathName()); : new StringBuilder(inode.getFullPathName());
for (int i = 4; i < pathComponents.length; i++) { for (int i = 4; i < pathComponents.length; i++) {
path.append(Path.SEPARATOR).append(DFSUtil.bytes2String(pathComponents[i])); path.append(Path.SEPARATOR).append(DFSUtil.bytes2String(pathComponents[i]));
} }

View File

@ -909,6 +909,17 @@ public void testInodePath() throws FileNotFoundException {
components = INode.getPathComponents(testPath); components = INode.getPathComponents(testPath);
resolvedPath = FSDirectory.resolvePath(testPath, components, fsd); resolvedPath = FSDirectory.resolvePath(testPath, components, fsd);
assertEquals(testPath, resolvedPath); assertEquals(testPath, resolvedPath);
// Test path with nonexistent(deleted or wrong id) inode
Mockito.doReturn(null).when(fsd).getInode(Mockito.anyLong());
testPath = "/.reserved/.inodes/1234";
components = INode.getPathComponents(testPath);
try {
String realPath = FSDirectory.resolvePath(testPath, components, fsd);
fail("Path should not be resolved:" + realPath);
} catch (IOException e) {
assertTrue(e instanceof FileNotFoundException);
}
} }
/** /**