Browse Source

HADOOP-8775. MR2 distcp permits non-positive value to -bandwidth option which causes job never to complete. Contributed by Sandy Ryza.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1382121 13f79535-47bb-0310-9956-ffa450edef68
Aaron Myers 12 years ago
parent
commit
ee6d9ff79d

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

@@ -269,6 +269,9 @@ Release 2.0.1-alpha - UNRELEASED
     HADOOP-8431. Running distcp wo args throws IllegalArgumentException.
     HADOOP-8431. Running distcp wo args throws IllegalArgumentException.
     (Sandy Ryza via eli)
     (Sandy Ryza via eli)
 
 
+    HADOOP-8775. MR2 distcp permits non-positive value to -bandwidth option
+    which causes job never to complete. (Sandy Ryza via atm)
+
   BREAKDOWN OF HDFS-3042 SUBTASKS
   BREAKDOWN OF HDFS-3042 SUBTASKS
 
 
     HADOOP-8220. ZKFailoverController doesn't handle failure to become active
     HADOOP-8220. ZKFailoverController doesn't handle failure to become active

+ 4 - 0
hadoop-tools/hadoop-distcp/src/main/java/org/apache/hadoop/tools/OptionsParser.java

@@ -156,6 +156,10 @@ public class OptionsParser {
       try {
       try {
         Integer mapBandwidth = Integer.parseInt(
         Integer mapBandwidth = Integer.parseInt(
             getVal(command, DistCpOptionSwitch.BANDWIDTH.getSwitch()).trim());
             getVal(command, DistCpOptionSwitch.BANDWIDTH.getSwitch()).trim());
+        if (mapBandwidth.intValue() <= 0) {
+          throw new IllegalArgumentException("Bandwidth specified is not positive: " +
+              mapBandwidth);
+        }
         option.setMapBandwidth(mapBandwidth);
         option.setMapBandwidth(mapBandwidth);
       } catch (NumberFormatException e) {
       } catch (NumberFormatException e) {
         throw new IllegalArgumentException("Bandwidth specified is invalid: " +
         throw new IllegalArgumentException("Bandwidth specified is invalid: " +

+ 18 - 0
hadoop-tools/hadoop-distcp/src/test/java/org/apache/hadoop/tools/TestOptionsParser.java

@@ -110,6 +110,24 @@ public class TestOptionsParser {
         "hdfs://localhost:8020/target/"});
         "hdfs://localhost:8020/target/"});
     Assert.assertEquals(options.getMapBandwidth(), 11);
     Assert.assertEquals(options.getMapBandwidth(), 11);
   }
   }
+  
+  @Test(expected=IllegalArgumentException.class)
+  public void testParseNonPositiveBandwidth() {
+    OptionsParser.parse(new String[] {
+        "-bandwidth",
+        "-11",
+        "hdfs://localhost:8020/source/first",
+        "hdfs://localhost:8020/target/"});
+  }
+  
+  @Test(expected=IllegalArgumentException.class)
+  public void testParseZeroBandwidth() {
+    OptionsParser.parse(new String[] {
+        "-bandwidth",
+        "0",
+        "hdfs://localhost:8020/source/first",
+        "hdfs://localhost:8020/target/"});
+  }
 
 
   @Test
   @Test
   public void testParseSkipCRC() {
   public void testParseSkipCRC() {