Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 0C94D200B9D for ; Thu, 13 Oct 2016 18:16:02 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 0B2D4160AE4; Thu, 13 Oct 2016 16:16:02 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 982E3160AD2 for ; Thu, 13 Oct 2016 18:16:00 +0200 (CEST) Received: (qmail 77097 invoked by uid 500); 13 Oct 2016 16:15:59 -0000 Mailing-List: contact common-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list common-commits@hadoop.apache.org Received: (qmail 77087 invoked by uid 99); 13 Oct 2016 16:15:59 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 13 Oct 2016 16:15:59 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 6E8BDE04AF; Thu, 13 Oct 2016 16:15:59 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: brahma@apache.org To: common-commits@hadoop.apache.org Date: Thu, 13 Oct 2016 16:15:59 -0000 Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: [1/2] hadoop git commit: 10986. DFSAdmin should log detailed error message if any. Contributed by MingLiang Liu archived-at: Thu, 13 Oct 2016 16:16:02 -0000 Repository: hadoop Updated Branches: refs/heads/branch-2 a6197c1fa -> b60e545a0 refs/heads/trunk 9454dc5e8 -> 29aa11b1a 10986. DFSAdmin should log detailed error message if any. Contributed by MingLiang Liu Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/29aa11b1 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/29aa11b1 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/29aa11b1 Branch: refs/heads/trunk Commit: 29aa11b1a252e007ed62fad362096ca43aa408af Parents: 9454dc5 Author: Brahma Reddy Battula Authored: Thu Oct 13 21:39:50 2016 +0530 Committer: Brahma Reddy Battula Committed: Thu Oct 13 21:39:50 2016 +0530 ---------------------------------------------------------------------- .../org/apache/hadoop/hdfs/tools/DFSAdmin.java | 8 +- .../apache/hadoop/hdfs/tools/TestDFSAdmin.java | 106 +++++++++---------- 2 files changed, 51 insertions(+), 63 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/29aa11b1/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java index 32401dc..a60f24b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java @@ -936,8 +936,7 @@ public class DFSAdmin extends FsShell { System.out.println("Balancer bandwidth is " + bandwidth + " bytes per second."); } catch (IOException ioe) { - System.err.println("Datanode unreachable."); - return -1; + throw new IOException("Datanode unreachable. " + ioe, ioe); } return 0; } @@ -2207,7 +2206,7 @@ public class DFSAdmin extends FsShell { dnProxy.evictWriters(); System.out.println("Requested writer eviction to datanode " + dn); } catch (IOException ioe) { - return -1; + throw new IOException("Datanode unreachable. " + ioe, ioe); } return 0; } @@ -2218,8 +2217,7 @@ public class DFSAdmin extends FsShell { DatanodeLocalInfo dnInfo = dnProxy.getDatanodeInfo(); System.out.println(dnInfo.getDatanodeLocalReport()); } catch (IOException ioe) { - System.err.println("Datanode unreachable."); - return -1; + throw new IOException("Datanode unreachable. " + ioe, ioe); } return 0; } http://git-wip-us.apache.org/repos/asf/hadoop/blob/29aa11b1/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/TestDFSAdmin.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/TestDFSAdmin.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/TestDFSAdmin.java index b49f73d..dca42ea 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/TestDFSAdmin.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/TestDFSAdmin.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hdfs.tools; +import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.IPC_CLIENT_CONNECT_MAX_RETRIES_KEY; import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_DATANODE_DATA_DIR_KEY; import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_HEARTBEAT_INTERVAL_DEFAULT; import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_HEARTBEAT_INTERVAL_KEY; @@ -79,6 +80,7 @@ public class TestDFSAdmin { @Before public void setUp() throws Exception { conf = new Configuration(); + conf.setInt(IPC_CLIENT_CONNECT_MAX_RETRIES_KEY, 3); restartCluster(); admin = new DFSAdmin(); @@ -116,7 +118,7 @@ public class TestDFSAdmin { if (cluster != null) { cluster.shutdown(); } - cluster = new MiniDFSCluster.Builder(conf).numDataNodes(1).build(); + cluster = new MiniDFSCluster.Builder(conf).numDataNodes(2).build(); cluster.waitActive(); datanode = cluster.getDataNodes().get(0); namenode = cluster.getNameNode(); @@ -171,70 +173,58 @@ public class TestDFSAdmin { @Test(timeout = 30000) public void testGetDatanodeInfo() throws Exception { redirectStream(); - final Configuration dfsConf = new HdfsConfiguration(); - final int numDn = 2; - - /* init cluster */ - try (MiniDFSCluster miniCluster = new MiniDFSCluster.Builder(dfsConf) - .numDataNodes(numDn).build()) { - - miniCluster.waitActive(); - assertEquals(numDn, miniCluster.getDataNodes().size()); - final DFSAdmin dfsAdmin = new DFSAdmin(dfsConf); + final DFSAdmin dfsAdmin = new DFSAdmin(conf); - /* init reused vars */ - List outs = null; - int ret; - - /** - * test erroneous run - */ + for (int i = 0; i < cluster.getDataNodes().size(); i++) { resetStream(); - outs = Lists.newArrayList(); - - /* invoke getDatanodeInfo */ - ret = ToolRunner.run( - dfsAdmin, - new String[] {"-getDatanodeInfo", "128.0.0.1:1234"}); + final DataNode dn = cluster.getDataNodes().get(i); + final String addr = String.format( + "%s:%d", + dn.getXferAddress().getHostString(), + dn.getIpcPort()); + final int ret = ToolRunner.run(dfsAdmin, + new String[]{"-getDatanodeInfo", addr}); + assertEquals(0, ret); /* collect outputs */ + final List outs = Lists.newArrayList(); scanIntoList(out, outs); - /* verify results */ + assertEquals( + "One line per DataNode like: Uptime: XXX, Software version: x.y.z," + + " Config version: core-x.y.z,hdfs-x", + 1, outs.size()); + assertThat(outs.get(0), + is(allOf(containsString("Uptime:"), + containsString("Software version"), + containsString("Config version")))); + } + } + + /** + * Test that if datanode is not reachable, some DFSAdmin commands will fail + * elegantly with non-zero ret error code along with exception error message. + */ + @Test(timeout = 60000) + public void testDFSAdminUnreachableDatanode() throws Exception { + redirectStream(); + final DFSAdmin dfsAdmin = new DFSAdmin(conf); + for (String command : new String[]{"-getDatanodeInfo", + "-evictWriters", "-getBalancerBandwidth"}) { + // Connecting to Xfer port instead of IPC port will get + // Datanode unreachable. java.io.EOFException + final String dnDataAddr = datanode.getXferAddress().getHostString() + ":" + + datanode.getXferPort(); + resetStream(); + final List outs = Lists.newArrayList(); + final int ret = ToolRunner.run(dfsAdmin, + new String[]{command, dnDataAddr}); assertEquals(-1, ret); - assertTrue("Unexpected getDatanodeInfo stdout", outs.isEmpty()); - - /** - * test normal run - */ - for (int i = 0; i < numDn; i++) { - resetStream(); - final DataNode dn = miniCluster.getDataNodes().get(i); - - /* invoke getDatanodeInfo */ - final String addr = String.format( - "%s:%d", - dn.getXferAddress().getHostString(), - dn.getIpcPort()); - ret = ToolRunner.run( - dfsAdmin, - new String[] {"-getDatanodeInfo", addr}); - - /* collect outputs */ - outs = Lists.newArrayList(); - scanIntoList(out, outs); - - /* verify results */ - assertEquals(0, ret); - assertEquals( - "One line per DataNode like: Uptime: XXX, Software version: x.y.z," - + " Config version: core-x.y.z,hdfs-x", - 1, outs.size()); - assertThat(outs.get(0), - is(allOf(containsString("Uptime:"), - containsString("Software version"), - containsString("Config version")))); - } + + scanIntoList(out, outs); + assertTrue("Unexpected " + command + " stdout: " + out, outs.isEmpty()); + assertTrue("Unexpected " + command + " stderr: " + err, + err.toString().contains("Exception")); } } --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org For additional commands, e-mail: common-commits-help@hadoop.apache.org