diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index ad74420550..a91d4df460 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -264,6 +264,9 @@ Release 0.23.3 - UNRELEASED HADOOP-8197. Configuration logs WARNs on every use of a deprecated key (tucu) + HADOOP-8159. NetworkTopology: getLeaf should check for invalid topologies. + (Colin Patrick McCabe via eli) + BREAKDOWN OF HADOOP-7454 SUBTASKS HADOOP-7455. HA: Introduce HA Service Protocol Interface. (suresh) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetworkTopology.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetworkTopology.java index 1c93f41d62..67fddd7e58 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetworkTopology.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetworkTopology.java @@ -45,6 +45,13 @@ public class NetworkTopology { public static final Log LOG = LogFactory.getLog(NetworkTopology.class); + public static class InvalidTopologyException extends RuntimeException { + private static final long serialVersionUID = 1L; + public InvalidTopologyException(String msg) { + super(msg); + } + } + /** InnerNode represents a switch/router of a data center or rack. * Different from a leaf node, it has non-null children. */ @@ -311,6 +318,8 @@ int getNumOfLeaves() { * the root cluster map */ InnerNode clusterMap = new InnerNode(InnerNode.ROOT); + /** Depth of all leaf nodes */ + private int depthOfAllLeaves = -1; /** rack counter */ private int numOfRacks = 0; /** the lock used to manage access */ @@ -328,6 +337,7 @@ public NetworkTopology() { */ public void add(Node node) { if (node==null) return; + String oldTopoStr = this.toString(); if( node instanceof InnerNode ) { throw new IllegalArgumentException( "Not allow to add an inner node: "+NodeBase.getPath(node)); @@ -345,6 +355,19 @@ public void add(Node node) { if (rack == null) { numOfRacks++; } + if (!(node instanceof InnerNode)) { + if (depthOfAllLeaves == -1) { + depthOfAllLeaves = node.getLevel(); + } else { + if (depthOfAllLeaves != node.getLevel()) { + LOG.error("Error: can't add leaf node at depth " + + node.getLevel() + " to topology:\n" + oldTopoStr); + throw new InvalidTopologyException("Invalid network topology. " + + "You cannot have a rack and a non-rack node at the same " + + "level of the network topology."); + } + } + } } if(LOG.isDebugEnabled()) { LOG.debug("NetworkTopology became:\n" + this.toString());