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:
parent
e9c83b20f6
commit
06fb184d4d
|
@ -259,6 +259,9 @@ Trunk (Unreleased)
|
|||
failure to unpack old image tarball that contains hard links.
|
||||
(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
|
||||
|
||||
HDFS-4145. Merge hdfs cmd line scripts from branch-1-win. (David Lao,
|
||||
|
|
|
@ -1793,7 +1793,6 @@ public class FSDirectory implements Closeable {
|
|||
}
|
||||
dir.clearChildren();
|
||||
}
|
||||
|
||||
|
||||
/** 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
|
||||
|
@ -1923,6 +1922,8 @@ public class FSDirectory implements Closeable {
|
|||
INodeDirectory parent = (INodeDirectory)inodes[inodes.length-2];
|
||||
dirNode = newNode;
|
||||
parent.replaceChild(newNode);
|
||||
// update the inodeMap
|
||||
inodeMap.put(newNode);
|
||||
}
|
||||
} else {
|
||||
// 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];
|
||||
dirNode = newNode;
|
||||
parent.replaceChild(newNode);
|
||||
// update the inodeMap
|
||||
inodeMap.put(newNode);
|
||||
}
|
||||
return (oldNsQuota != nsQuota || oldDsQuota != dsQuota) ? dirNode : null;
|
||||
}
|
||||
|
|
|
@ -19,8 +19,9 @@
|
|||
package org.apache.hadoop.hdfs.server.namenode;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
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 java.io.FileNotFoundException;
|
||||
|
@ -890,4 +891,39 @@ public class TestINodeFile {
|
|||
resolvedPath = FSDirectory.resolvePath(testPath, components, fsd);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue