Explorar o código

HADOOP-12772. NetworkTopologyWithNodeGroup.getNodeGroup() can loop infinitely for invalid 'loc' values. Contributed by Kuhu Shukla.

Kihwal Lee %!s(int64=9) %!d(string=hai) anos
pai
achega
49e176c29f

+ 3 - 0
hadoop-common-project/hadoop-common/CHANGES.txt

@@ -1718,6 +1718,9 @@ Release 2.7.3 - UNRELEASED
 
     HADOOP-12761. incremental maven build is not really incremental (sjlee)
 
+    HADOOP-12772. NetworkTopologyWithNodeGroup.getNodeGroup() can loop
+    infinitely for invalid 'loc' values (Kuhu Shukla via kihwal)
+
 Release 2.7.2 - 2016-01-25
 
   INCOMPATIBLE CHANGES

+ 6 - 1
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetworkTopologyWithNodeGroup.java

@@ -101,7 +101,12 @@ public class NetworkTopologyWithNodeGroup extends NetworkTopology {
           return null;
         } else {
           // may be a leaf node
-          return getNodeGroup(node.getNetworkLocation());
+          if(!(node.getNetworkLocation() == null ||
+              node.getNetworkLocation().isEmpty())) {
+            return getNodeGroup(node.getNetworkLocation());
+          } else {
+            return NodeBase.ROOT;
+          }
         }
       } else {
         // not in cluster map, don't handle it

+ 8 - 1
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NodeBase.java

@@ -127,7 +127,14 @@ public class NodeBase implements Node {
    * is not {@link #PATH_SEPARATOR}
    */
   public static String normalize(String path) {
-    if (path == null || path.length() == 0) return ROOT;
+    if (path == null) {
+      throw new IllegalArgumentException(
+          "Network Location is null ");
+    }
+
+    if (path.length() == 0) {
+      return ROOT;
+    }
     
     if (path.charAt(0) != PATH_SEPARATOR) {
       throw new IllegalArgumentException(

+ 14 - 1
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetworkTopologyWithNodeGroup.java

@@ -178,7 +178,20 @@ public class TestNetworkTopologyWithNodeGroup {
       assertTrue(frequency.get(key) > 0 || key == dataNodes[0]);
     }
   }
-  
+
+  @Test
+  public void testNodeGroup() throws Exception {
+    String res = cluster.getNodeGroup("");
+    assertTrue("NodeGroup should be NodeBase.ROOT for empty location",
+        res.equals(NodeBase.ROOT));
+    try {
+      cluster.getNodeGroup(null);
+    } catch (IllegalArgumentException e) {
+      assertTrue("Null Network Location should throw exception!",
+          e.getMessage().contains("Network Location is null"));
+    }
+  }
+
   /**
    * This test checks that adding a node with invalid topology will be failed 
    * with an exception to show topology is invalid.