diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/balancer/Balancer.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/balancer/Balancer.java index 93270107dd..a63c3b8257 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/balancer/Balancer.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/balancer/Balancer.java @@ -94,7 +94,7 @@ * * *

DESCRIPTION - *

The threshold parameter is a fraction in the range of (0%, 100%) with a + *

The threshold parameter is a fraction in the range of (1%, 100%) with a * default value of 10%. The threshold sets a target for whether the cluster * is balanced. A cluster is balanced if for each datanode, the utilization * of the node (ratio of used space at the node to total capacity of the node) @@ -1503,14 +1503,14 @@ static Parameters parse(String[] args) { i++; try { threshold = Double.parseDouble(args[i]); - if (threshold < 0 || threshold > 100) { - throw new NumberFormatException( + if (threshold < 1 || threshold > 100) { + throw new IllegalArgumentException( "Number out of range: threshold = " + threshold); } LOG.info( "Using a threshold of " + threshold ); - } catch(NumberFormatException e) { + } catch(IllegalArgumentException e) { System.err.println( - "Expecting a number in the range of [0.0, 100.0]: " + "Expecting a number in the range of [1.0, 100.0]: " + args[i]); throw e; } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/balancer/TestBalancer.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/balancer/TestBalancer.java index 81b03a568e..11dbfc89e0 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/balancer/TestBalancer.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/balancer/TestBalancer.java @@ -26,8 +26,6 @@ import java.util.Random; import java.util.concurrent.TimeoutException; -import junit.framework.TestCase; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; @@ -46,11 +44,14 @@ import org.apache.hadoop.hdfs.protocol.LocatedBlock; import org.apache.hadoop.hdfs.protocol.HdfsConstants.DatanodeReportType; import org.apache.hadoop.hdfs.server.datanode.SimulatedFSDataset; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; /** * This class tests if a balancer schedules tasks correctly. */ -public class TestBalancer extends TestCase { +public class TestBalancer { private static final Log LOG = LogFactory.getLog( "org.apache.hadoop.hdfs.TestBalancer"); @@ -365,8 +366,33 @@ public void integrationTest(Configuration conf) throws Exception { oneNodeTest(conf); } + /** + * Test parse method in Balancer#Cli class with threshold value out of + * boundaries. + */ + @Test + public void testBalancerCliParseWithThresholdOutOfBoundaries() { + String parameters[] = new String[] { "-threshold", "0" }; + String reason = "IllegalArgumentException is expected when threshold value" + + " is out of boundary."; + try { + Balancer.Cli.parse(parameters); + fail(reason); + } catch (IllegalArgumentException e) { + assertEquals("Number out of range: threshold = 0.0", e.getMessage()); + } + parameters = new String[] { "-threshold", "101" }; + try { + Balancer.Cli.parse(parameters); + fail(reason); + } catch (IllegalArgumentException e) { + assertEquals("Number out of range: threshold = 101.0", e.getMessage()); + } + } + /** Test a cluster with even distribution, * then a new empty node is added to the cluster*/ + @Test public void testBalancer0() throws Exception { Configuration conf = new HdfsConfiguration(); initConf(conf); @@ -375,6 +401,7 @@ public void testBalancer0() throws Exception { } /** Test unevenly distributed cluster */ + @Test public void testBalancer1() throws Exception { Configuration conf = new HdfsConfiguration(); initConf(conf); @@ -384,6 +411,7 @@ public void testBalancer1() throws Exception { new String[] {RACK0, RACK1}); } + @Test public void testBalancer2() throws Exception { Configuration conf = new HdfsConfiguration(); initConf(conf);