From e29d76663c5bc4f7602037cd13a97631fe81fedc Mon Sep 17 00:00:00 2001 From: Uma Maheswara Rao G Date: Tue, 1 May 2012 06:51:56 +0000 Subject: [PATCH] merge 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/branches/branch-2@1332532 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 ++ .../hadoop/hdfs/server/balancer/Balancer.java | 10 +++--- .../hdfs/server/balancer/TestBalancer.java | 34 +++++++++++++++++-- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 060f101a068..bc09fc4e0f6 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -454,6 +454,9 @@ Release 2.0.0 - UNRELEASED HDFS-3275. Skip format for non-file based directories. (Amith D K via umamahesh) + HDFS-3286. When the threshold value for balancer is zero, unexpected output is displayed. + (Ashish Singhi via umamahesh) + BREAKDOWN OF HDFS-1623 SUBTASKS HDFS-2179. Add fencing framework and mechanisms for NameNode HA. (todd) 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 c2cf4a2a739..8628f937e23 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 @@ import org.apache.hadoop.util.ToolRunner; * * *

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 @@ public class Balancer { 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 81b03a568e2..11dbfc89e0e 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.List; 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.ExtendedBlock; 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 class TestBalancer extends TestCase { 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 class TestBalancer extends TestCase { } /** Test unevenly distributed cluster */ + @Test public void testBalancer1() throws Exception { Configuration conf = new HdfsConfiguration(); initConf(conf); @@ -384,6 +411,7 @@ public class TestBalancer extends TestCase { new String[] {RACK0, RACK1}); } + @Test public void testBalancer2() throws Exception { Configuration conf = new HdfsConfiguration(); initConf(conf);