From 6ecbb350193dceefa7c9155d1687f1548358c430 Mon Sep 17 00:00:00 2001 From: Suresh Srinivas Date: Thu, 31 Jan 2013 18:44:37 +0000 Subject: [PATCH] HDFS-4151. hdfs balancer command returns exit code 1 on success instead of 0. Contributed by Joshua Blatt. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1441113 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 ++ .../hadoop/hdfs/server/balancer/Balancer.java | 12 +++-- .../hdfs/server/balancer/TestBalancer.java | 52 +++++++++++++++---- 3 files changed, 55 insertions(+), 12 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index a314d0f7e75..079fac57794 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -738,6 +738,9 @@ Release 2.0.3-alpha - Unreleased HDFS-4428. FsDatasetImpl should disclose what the error is when a rename fails. (Colin Patrick McCabe via atm) + HDFS-4151. hdfs balancer command returns exit code 1 on success instead + of 0. (Joshua Blatt via suresh) + BREAKDOWN OF HDFS-3077 SUBTASKS HDFS-3077. Quorum-based protocol for reading and writing edit logs. 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 b64844ba523..109ba719734 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 @@ -1333,8 +1333,9 @@ public class Balancer { // Exit status enum ReturnStatus { - SUCCESS(1), - IN_PROGRESS(0), + // These int values will map directly to the balancer process's exit code. + SUCCESS(0), + IN_PROGRESS(1), ALREADY_RUNNING(-1), NO_MOVE_BLOCK(-2), NO_MOVE_PROGRESS(-3), @@ -1507,7 +1508,12 @@ public class Balancer { } static class Cli extends Configured implements Tool { - /** Parse arguments and then run Balancer */ + /** + * Parse arguments and then run Balancer. + * + * @param args command specific arguments. + * @return exit code. 0 indicates success, non-zero indicates failure. + */ @Override public int run(String[] args) { final long startTime = Time.now(); 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 b8450f1a661..86dd3ab7589 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 @@ -46,8 +46,10 @@ import org.apache.hadoop.hdfs.protocol.DatanodeInfo; import org.apache.hadoop.hdfs.protocol.ExtendedBlock; import org.apache.hadoop.hdfs.protocol.HdfsConstants.DatanodeReportType; import org.apache.hadoop.hdfs.protocol.LocatedBlock; +import org.apache.hadoop.hdfs.server.balancer.Balancer.Cli; import org.apache.hadoop.hdfs.server.datanode.SimulatedFSDataset; import org.apache.hadoop.util.Time; +import org.apache.hadoop.util.Tool; import org.junit.Test; /** @@ -95,7 +97,6 @@ public class TestBalancer { DFSTestUtil.waitReplication(fs, filePath, replicationFactor); } - /* fill up a cluster with numNodes datanodes * whose used space to be size */ @@ -301,10 +302,12 @@ public class TestBalancer { * @param racks - array of racks for original nodes in cluster * @param newCapacity - new node's capacity * @param newRack - new node's rack + * @param useTool - if true run test via Cli with command-line argument + * parsing, etc. Otherwise invoke balancer API directly. * @throws Exception */ private void doTest(Configuration conf, long[] capacities, String[] racks, - long newCapacity, String newRack) throws Exception { + long newCapacity, String newRack, boolean useTool) throws Exception { assertEquals(capacities.length, racks.length); int numOfDatanodes = capacities.length; cluster = new MiniDFSCluster.Builder(conf) @@ -330,7 +333,11 @@ public class TestBalancer { totalCapacity += newCapacity; // run balancer and validate results - runBalancer(conf, totalUsedSpace, totalCapacity); + if (useTool) { + runBalancerCli(conf, totalUsedSpace, totalCapacity); + } else { + runBalancer(conf, totalUsedSpace, totalCapacity); + } } finally { cluster.shutdown(); } @@ -350,22 +357,38 @@ public class TestBalancer { waitForBalancer(totalUsedSpace, totalCapacity, client, cluster); } + private void runBalancerCli(Configuration conf, + long totalUsedSpace, long totalCapacity) throws Exception { + waitForHeartBeat(totalUsedSpace, totalCapacity, client, cluster); + + final String[] args = { "-policy", "datanode" }; + final Tool tool = new Cli(); + tool.setConf(conf); + final int r = tool.run(args); // start rebalancing + + assertEquals("Tools should exit 0 on success", 0, r); + waitForHeartBeat(totalUsedSpace, totalCapacity, client, cluster); + LOG.info("Rebalancing with default ctor."); + waitForBalancer(totalUsedSpace, totalCapacity, client, cluster); + } + /** one-node cluster test*/ - private void oneNodeTest(Configuration conf) throws Exception { + private void oneNodeTest(Configuration conf, boolean useTool) throws Exception { // add an empty node with half of the CAPACITY & the same rack - doTest(conf, new long[]{CAPACITY}, new String[]{RACK0}, CAPACITY/2, RACK0); + doTest(conf, new long[]{CAPACITY}, new String[]{RACK0}, CAPACITY/2, + RACK0, useTool); } /** two-node cluster test */ private void twoNodeTest(Configuration conf) throws Exception { doTest(conf, new long[]{CAPACITY, CAPACITY}, new String[]{RACK0, RACK1}, - CAPACITY, RACK2); + CAPACITY, RACK2, false); } /** test using a user-supplied conf */ public void integrationTest(Configuration conf) throws Exception { initConf(conf); - oneNodeTest(conf); + oneNodeTest(conf, false); } /** @@ -401,7 +424,7 @@ public class TestBalancer { void testBalancer0Internal(Configuration conf) throws Exception { initConf(conf); - oneNodeTest(conf); + oneNodeTest(conf, false); twoNodeTest(conf); } @@ -495,7 +518,18 @@ public class TestBalancer { } - + /** + * Verify balancer exits 0 on success. + */ + @Test(timeout=100000) + public void testExitZeroOnSuccess() throws Exception { + final Configuration conf = new HdfsConfiguration(); + + initConf(conf); + + oneNodeTest(conf, true); + } + /** * @param args */