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.
|
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,
|
||||||
|
|
|
@ -1794,7 +1794,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
|
||||||
* rooted at the directory.
|
* rooted at the directory.
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue