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

This commit is contained in:
yliu 2015-08-13 16:45:20 +08:00
parent 40f815131e
commit 53bef9c5b9
3 changed files with 21 additions and 20 deletions

View File

@ -749,6 +749,8 @@ Release 2.8.0 - UNRELEASED
HADOOP-12318. Expose underlying LDAP exceptions in SaslPlainServer. (Mike
Yoder via atm)
HADOOP-12295. Improve NetworkTopology#InnerNode#remove logic. (yliu)
OPTIMIZATIONS
HADOOP-11785. Reduce the number of listStatus operation in distcp

View File

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

View File

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