10986. DFSAdmin should log detailed error message if any. Contributed by MingLiang Liu
(cherry picked from commit 29aa11b1a252e007ed62fad362096ca43aa408af)
This commit is contained in:
parent
a6197c1fa8
commit
b60e545a08
|
@ -911,8 +911,7 @@ public class DFSAdmin extends FsShell {
|
||||||
System.out.println("Balancer bandwidth is " + bandwidth
|
System.out.println("Balancer bandwidth is " + bandwidth
|
||||||
+ " bytes per second.");
|
+ " bytes per second.");
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
System.err.println("Datanode unreachable.");
|
throw new IOException("Datanode unreachable. " + ioe, ioe);
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2178,7 +2177,7 @@ public class DFSAdmin extends FsShell {
|
||||||
dnProxy.evictWriters();
|
dnProxy.evictWriters();
|
||||||
System.out.println("Requested writer eviction to datanode " + dn);
|
System.out.println("Requested writer eviction to datanode " + dn);
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
return -1;
|
throw new IOException("Datanode unreachable. " + ioe, ioe);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2189,8 +2188,7 @@ public class DFSAdmin extends FsShell {
|
||||||
DatanodeLocalInfo dnInfo = dnProxy.getDatanodeInfo();
|
DatanodeLocalInfo dnInfo = dnProxy.getDatanodeInfo();
|
||||||
System.out.println(dnInfo.getDatanodeLocalReport());
|
System.out.println(dnInfo.getDatanodeLocalReport());
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
System.err.println("Datanode unreachable.");
|
throw new IOException("Datanode unreachable. " + ioe, ioe);
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hadoop.hdfs.tools;
|
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_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_DEFAULT;
|
||||||
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_HEARTBEAT_INTERVAL_KEY;
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_HEARTBEAT_INTERVAL_KEY;
|
||||||
|
@ -79,6 +80,7 @@ public class TestDFSAdmin {
|
||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
conf = new Configuration();
|
conf = new Configuration();
|
||||||
|
conf.setInt(IPC_CLIENT_CONNECT_MAX_RETRIES_KEY, 3);
|
||||||
restartCluster();
|
restartCluster();
|
||||||
|
|
||||||
admin = new DFSAdmin();
|
admin = new DFSAdmin();
|
||||||
|
@ -116,7 +118,7 @@ public class TestDFSAdmin {
|
||||||
if (cluster != null) {
|
if (cluster != null) {
|
||||||
cluster.shutdown();
|
cluster.shutdown();
|
||||||
}
|
}
|
||||||
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(1).build();
|
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(2).build();
|
||||||
cluster.waitActive();
|
cluster.waitActive();
|
||||||
datanode = cluster.getDataNodes().get(0);
|
datanode = cluster.getDataNodes().get(0);
|
||||||
namenode = cluster.getNameNode();
|
namenode = cluster.getNameNode();
|
||||||
|
@ -171,61 +173,23 @@ public class TestDFSAdmin {
|
||||||
@Test(timeout = 30000)
|
@Test(timeout = 30000)
|
||||||
public void testGetDatanodeInfo() throws Exception {
|
public void testGetDatanodeInfo() throws Exception {
|
||||||
redirectStream();
|
redirectStream();
|
||||||
final Configuration dfsConf = new HdfsConfiguration();
|
final DFSAdmin dfsAdmin = new DFSAdmin(conf);
|
||||||
final int numDn = 2;
|
|
||||||
|
|
||||||
/* init cluster */
|
for (int i = 0; i < cluster.getDataNodes().size(); i++) {
|
||||||
try (MiniDFSCluster miniCluster = new MiniDFSCluster.Builder(dfsConf)
|
|
||||||
.numDataNodes(numDn).build()) {
|
|
||||||
|
|
||||||
miniCluster.waitActive();
|
|
||||||
assertEquals(numDn, miniCluster.getDataNodes().size());
|
|
||||||
final DFSAdmin dfsAdmin = new DFSAdmin(dfsConf);
|
|
||||||
|
|
||||||
/* init reused vars */
|
|
||||||
List<String> outs = null;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* test erroneous run
|
|
||||||
*/
|
|
||||||
resetStream();
|
resetStream();
|
||||||
outs = Lists.newArrayList();
|
final DataNode dn = cluster.getDataNodes().get(i);
|
||||||
|
|
||||||
/* invoke getDatanodeInfo */
|
|
||||||
ret = ToolRunner.run(
|
|
||||||
dfsAdmin,
|
|
||||||
new String[] {"-getDatanodeInfo", "128.0.0.1:1234"});
|
|
||||||
|
|
||||||
/* collect outputs */
|
|
||||||
scanIntoList(out, outs);
|
|
||||||
|
|
||||||
/* verify results */
|
|
||||||
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(
|
final String addr = String.format(
|
||||||
"%s:%d",
|
"%s:%d",
|
||||||
dn.getXferAddress().getHostString(),
|
dn.getXferAddress().getHostString(),
|
||||||
dn.getIpcPort());
|
dn.getIpcPort());
|
||||||
ret = ToolRunner.run(
|
final int ret = ToolRunner.run(dfsAdmin,
|
||||||
dfsAdmin,
|
new String[]{"-getDatanodeInfo", addr});
|
||||||
new String[] {"-getDatanodeInfo", addr});
|
assertEquals(0, ret);
|
||||||
|
|
||||||
/* collect outputs */
|
/* collect outputs */
|
||||||
outs = Lists.newArrayList();
|
final List<String> outs = Lists.newArrayList();
|
||||||
scanIntoList(out, outs);
|
scanIntoList(out, outs);
|
||||||
|
|
||||||
/* verify results */
|
/* verify results */
|
||||||
assertEquals(0, ret);
|
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"One line per DataNode like: Uptime: XXX, Software version: x.y.z,"
|
"One line per DataNode like: Uptime: XXX, Software version: x.y.z,"
|
||||||
+ " Config version: core-x.y.z,hdfs-x",
|
+ " Config version: core-x.y.z,hdfs-x",
|
||||||
|
@ -236,6 +200,32 @@ public class TestDFSAdmin {
|
||||||
containsString("Config 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<String> outs = Lists.newArrayList();
|
||||||
|
final int ret = ToolRunner.run(dfsAdmin,
|
||||||
|
new String[]{command, dnDataAddr});
|
||||||
|
assertEquals(-1, ret);
|
||||||
|
|
||||||
|
scanIntoList(out, outs);
|
||||||
|
assertTrue("Unexpected " + command + " stdout: " + out, outs.isEmpty());
|
||||||
|
assertTrue("Unexpected " + command + " stderr: " + err,
|
||||||
|
err.toString().contains("Exception"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(timeout = 30000)
|
@Test(timeout = 30000)
|
||||||
|
|
Loading…
Reference in New Issue