HDFS-4757. Update FSDirectory#inodeMap when replacing an INodeDirectory while setting quota. Contributed by Jing Zhao

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1476005 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Tsz-wo Sze 2013-04-26 00:50:09 +00:00
parent e9c83b20f6
commit 06fb184d4d
3 changed files with 44 additions and 2 deletions

View File

@ -259,6 +259,9 @@ Trunk (Unreleased)
failure to unpack old image tarball that contains hard links. failure to unpack old image tarball that contains hard links.
(Chris Nauroth via szetszwo) (Chris Nauroth via szetszwo)
HDFS-4757. Update FSDirectory#inodeMap when replacing an INodeDirectory
while setting quota. (Jing Zhao via szetszwo)
BREAKDOWN OF HADOOP-8562 SUBTASKS AND RELATED JIRAS BREAKDOWN OF HADOOP-8562 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

@ -1793,7 +1793,6 @@ public class FSDirectory implements Closeable {
} }
dir.clearChildren(); dir.clearChildren();
} }
/** Update the count of each directory with quota in the namespace /** Update the count of each directory with quota in the namespace
* A directory's count is defined as the total number inodes in the tree * A directory's count is defined as the total number inodes in the tree
@ -1923,6 +1922,8 @@ public class FSDirectory implements Closeable {
INodeDirectory parent = (INodeDirectory)inodes[inodes.length-2]; INodeDirectory parent = (INodeDirectory)inodes[inodes.length-2];
dirNode = newNode; dirNode = newNode;
parent.replaceChild(newNode); parent.replaceChild(newNode);
// update the inodeMap
inodeMap.put(newNode);
} }
} else { } else {
// a non-quota directory; so replace it with a directory with quota // a non-quota directory; so replace it with a directory with quota
@ -1932,6 +1933,8 @@ public class FSDirectory implements Closeable {
INodeDirectory parent = (INodeDirectory)inodes[inodes.length-2]; INodeDirectory parent = (INodeDirectory)inodes[inodes.length-2];
dirNode = newNode; dirNode = newNode;
parent.replaceChild(newNode); parent.replaceChild(newNode);
// update the inodeMap
inodeMap.put(newNode);
} }
return (oldNsQuota != nsQuota || oldDsQuota != dsQuota) ? dirNode : null; return (oldNsQuota != nsQuota || oldDsQuota != dsQuota) ? dirNode : null;
} }

View File

@ -19,8 +19,9 @@
package org.apache.hadoop.hdfs.server.namenode; package org.apache.hadoop.hdfs.server.namenode;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@ -890,4 +891,39 @@ public class TestINodeFile {
resolvedPath = FSDirectory.resolvePath(testPath, components, fsd); resolvedPath = FSDirectory.resolvePath(testPath, components, fsd);
assertEquals(testPath, resolvedPath); assertEquals(testPath, resolvedPath);
} }
/**
* Test whether the inode in inodeMap has been replaced after regular inode
* replacement
*/
@Test
public void testInodeReplacement() throws Exception {
final Configuration conf = new Configuration();
final MiniDFSCluster cluster = new MiniDFSCluster.Builder(conf).
numDataNodes(1).build();
cluster.waitActive();
final DistributedFileSystem hdfs = cluster.getFileSystem();
final FSDirectory fsdir = cluster.getNamesystem().getFSDirectory();
final Path dir = new Path("/dir");
hdfs.mkdirs(dir);
INode dirNode = fsdir.getINode(dir.toString());
INode dirNodeFromNode = fsdir.getInode(dirNode.getId());
assertSame(dirNode, dirNodeFromNode);
// set quota to dir, which leads to node replacement
hdfs.setQuota(dir, Long.MAX_VALUE - 1, Long.MAX_VALUE - 1);
dirNode = fsdir.getINode(dir.toString());
assertTrue(dirNode instanceof INodeDirectoryWithQuota);
// the inode in inodeMap should also be replaced
dirNodeFromNode = fsdir.getInode(dirNode.getId());
assertSame(dirNode, dirNodeFromNode);
hdfs.setQuota(dir, -1, -1);
dirNode = fsdir.getINode(dir.toString());
assertTrue(dirNode instanceof INodeDirectory);
// the inode in inodeMap should also be replaced
dirNodeFromNode = fsdir.getInode(dirNode.getId());
assertSame(dirNode, dirNodeFromNode);
}
} }