HADOOP-12295. Improve NetworkTopology#InnerNode#remove logic. (yliu)

This commit is contained in:
yliu 2015-08-13 16:42:40 +08:00
parent 200fadedc0
commit 073cb16d81
3 changed files with 21 additions and 20 deletions

View File

@ -173,6 +173,8 @@ Release 2.8.0 - UNRELEASED
HADOOP-11813. releasedocmaker.py should use today's date instead of HADOOP-11813. releasedocmaker.py should use today's date instead of
unreleased (Darrell Taylor via aw) unreleased (Darrell Taylor via aw)
HADOOP-12295. Improve NetworkTopology#InnerNode#remove logic. (yliu)
BUG FIXES BUG FIXES
HADOOP-12124. Add HTrace support for FsShell (cmccabe) HADOOP-12124. Add HTrace support for FsShell (cmccabe)

View File

@ -166,10 +166,11 @@ private String getNextAncestorName(Node n) {
* @return true if the node is added; false otherwise * @return true if the node is added; false otherwise
*/ */
boolean add(Node n) { boolean add(Node n) {
if (!isAncestor(n)) if (!isAncestor(n)) {
throw new IllegalArgumentException(n.getName()+", which is located at " throw new IllegalArgumentException(n.getName()
+n.getNetworkLocation()+", is not a decendent of " + ", which is located at " + n.getNetworkLocation()
+getPath(this)); + ", is not a descendent of " + getPath(this));
}
if (isParent(n)) { if (isParent(n)) {
// this node is the parent of n; add n directly // this node is the parent of n; add n directly
n.setParent(this); n.setParent(this);
@ -227,12 +228,11 @@ protected InnerNode createParentNode(String parentName) {
* @return true if the node is deleted; false otherwise * @return true if the node is deleted; false otherwise
*/ */
boolean remove(Node n) { boolean remove(Node n) {
String parent = n.getNetworkLocation(); if (!isAncestor(n)) {
String currentPath = getPath(this);
if (!isAncestor(n))
throw new IllegalArgumentException(n.getName() throw new IllegalArgumentException(n.getName()
+", which is located at " + ", which is located at " + n.getNetworkLocation()
+parent+", is not a descendent of "+currentPath); + ", is not a descendent of " + getPath(this));
}
if (isParent(n)) { if (isParent(n)) {
// this node is the parent of n; remove n directly // this node is the parent of n; remove n directly
if (childrenMap.containsKey(n.getName())) { if (childrenMap.containsKey(n.getName())) {
@ -250,15 +250,8 @@ boolean remove(Node n) {
} else { } else {
// find the next ancestor node: the parent node // find the next ancestor node: the parent node
String parentName = getNextAncestorName(n); String parentName = getNextAncestorName(n);
InnerNode parentNode = null; InnerNode parentNode = (InnerNode)childrenMap.get(parentName);
int i; if (parentNode == null) {
for(i=0; i<children.size(); i++) {
if (children.get(i).getName().equals(parentName)) {
parentNode = (InnerNode)children.get(i);
break;
}
}
if (parentNode==null) {
return false; return false;
} }
// remove n from the parent node // remove n from the parent node
@ -266,8 +259,13 @@ boolean remove(Node n) {
// if the parent node has no children, remove the parent node too // if the parent node has no children, remove the parent node too
if (isRemoved) { if (isRemoved) {
if (parentNode.getNumOfChildren() == 0) { if (parentNode.getNumOfChildren() == 0) {
Node prev = children.remove(i); for(int i=0; i < children.size(); i++) {
childrenMap.remove(prev.getName()); if (children.get(i).getName().equals(parentName)) {
children.remove(i);
childrenMap.remove(parentName);
break;
}
}
} }
numOfLeaves--; numOfLeaves--;
} }

View File

@ -251,6 +251,7 @@ public void testRemove() throws Exception {
assertFalse(cluster.contains(dataNodes[i])); assertFalse(cluster.contains(dataNodes[i]));
} }
assertEquals(0, cluster.getNumOfLeaves()); assertEquals(0, cluster.getNumOfLeaves());
assertEquals(0, cluster.clusterMap.children.size());
for(int i=0; i<dataNodes.length; i++) { for(int i=0; i<dataNodes.length; i++) {
cluster.add(dataNodes[i]); cluster.add(dataNodes[i]);
} }