You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hdfs-dev@hadoop.apache.org by "Sihai Ke (JIRA)" <ji...@apache.org> on 2018/12/29 07:05:00 UTC

[jira] [Created] (HDFS-14181) Suspect there is a bug in NetworkTopology.java chooseRandom function.

Sihai Ke created HDFS-14181:
-------------------------------

             Summary: Suspect there is a bug in NetworkTopology.java chooseRandom function.
                 Key: HDFS-14181
                 URL: https://issues.apache.org/jira/browse/HDFS-14181
             Project: Hadoop HDFS
          Issue Type: Bug
          Components: hdfs, namenode
    Affects Versions: 2.9.2
            Reporter: Sihai Ke
         Attachments: image-2018-12-29-15-02-19-415.png

During reading the hadoop NetworkTopology.java, I suspect there is a bug in function 

chooseRandom (line 498, hadoop version 2.9.2-RC0), 

 I think there is a bug in{color:#f79232} code,{color:#333333} ~excludedScope doesn't mean availableNodes under Scope node, and I also add unit test for this and get an exception.{color}{color}
{quote}{color:#f79232}{color:#333333}protected Node chooseRandom(final String scope, String excludedScope,
 final Collection<Node> excludedNodes) {
 if (excludedScope != null) {
 if (scope.startsWith(excludedScope)) {
 return null;
 }
 if (!excludedScope.startsWith(scope)) {
 excludedScope = null;
 }
 }
 Node node = getNode(scope);
 if (!(node instanceof InnerNode)) {
 return excludedNodes != null && excludedNodes.contains(node) ?
 null : node;
 }
 InnerNode innerNode = (InnerNode)node;
 int numOfDatanodes = innerNode.getNumOfLeaves();
 if (excludedScope == null) {
 node = null;
 } else {
 node = getNode(excludedScope);
 if (!(node instanceof InnerNode)) {
 numOfDatanodes -= 1;
 } else {
 numOfDatanodes -= ((InnerNode)node).getNumOfLeaves();
 }
 }
 if (numOfDatanodes <= 0) {
 LOG.debug("Failed to find datanode (scope=\"{}\" excludedScope=\"{}\")."
 + " numOfDatanodes={}",
 scope, excludedScope, numOfDatanodes);
 return null;
 }
 final int availableNodes;
 if (excludedScope == null) {
 availableNodes = countNumOfAvailableNodes(scope, excludedNodes);
 } else {
 {color:#f79232}availableNodes ={color}
{color:#f79232} countNumOfAvailableNodes("~" + excludedScope, excludedNodes);{color}
 }
 LOG.debug("Choosing random from {} available nodes on node {},"
 + " scope={}, excludedScope={}, excludeNodes={}. numOfDatanodes={}.",
 availableNodes, innerNode, scope, excludedScope, excludedNodes,
 numOfDatanodes);
 Node ret = null;
 if (availableNodes > 0) {
 ret = chooseRandom(innerNode, node, excludedNodes, numOfDatanodes,
 availableNodes);
 }
 LOG.debug("chooseRandom returning {}", ret);
 return ret;
}{color}{color}
{quote}
 

{color:#f79232}{color:#333333}Add Unit Test in TestClusterTopology.java, but get exception.{color}{color}
{quote}public void testChooseRandom1() {
 // create the topology
 NetworkTopology cluster = NetworkTopology.getInstance(new Configuration());
 NodeElement node1 = getNewNode("node1", "/a1/b1/c1");
 cluster.add(node1);
 NodeElement node2 = getNewNode("node2", "/a1/b1/c1");
 cluster.add(node2);
 NodeElement node3 = getNewNode("node3", "/a1/b1/c2");
 cluster.add(node3);
 NodeElement node4 = getNewNode("node4", "/a1/b2/c3");
 cluster.add(node4);

 Node node = cluster.chooseRandom("/a1/b1", "/a1/b1/c1", null);
 assertSame(node.getName(), "node3");
}{quote}
{color:#f79232}{color:#333333}!image-2018-12-29-15-02-19-415.png!{color}{color}

 

[~vagarychen] this change is imported in PR HDFS-11577, could you help to check whether this is a bug ?

 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: hdfs-dev-unsubscribe@hadoop.apache.org
For additional commands, e-mail: hdfs-dev-help@hadoop.apache.org