HDFS-3286. When the threshold value for balancer is zero, unexpected output is displayed. Contributed by Ashish Singhi.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1332531 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Uma Maheswara Rao G 2012-05-01 06:44:12 +00:00
parent 086fa860c0
commit d37ec9d09e
2 changed files with 36 additions and 8 deletions

View File

@ -94,7 +94,7 @@
* </pre>
*
* <p>DESCRIPTION
* <p>The threshold parameter is a fraction in the range of (0%, 100%) with a
* <p>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;
}

View File

@ -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);