HADOOP-6723. Unchecked exceptions thrown in IPC Connection should not orphan clients. Contributed by Todd Lipcon.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@947747 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Thomas White 2010-05-24 18:24:16 +00:00
parent 70d7790cef
commit 2786e80436
3 changed files with 54 additions and 2 deletions

View File

@ -1569,6 +1569,9 @@ Release 0.21.0 - Unreleased
despite failure at any level. (Contributed by Ravi Gummadi and
Vinod Kumar Vavilapalli)
HADOOP-6723. Unchecked exceptions thrown in IPC Connection should not
orphan clients. (Todd Lipcon via tomwhite)
Release 0.20.3 - Unreleased
NEW FEATURES

View File

@ -602,8 +602,16 @@ public class Client {
LOG.debug(getName() + ": starting, having connections "
+ connections.size());
while (waitForWork()) {//wait here for work - read or close connection
receiveResponse();
try {
while (waitForWork()) {//wait here for work - read or close connection
receiveResponse();
}
} catch (Throwable t) {
// This truly is unexpected, since we catch IOException in receiveResponse
// -- this is only to be really sure that we don't leave a client hanging
// forever.
LOG.warn("Unexpected error reading responses on connection " + this, t);
markClosed(new IOException("Error reading responses", t));
}
close();

View File

@ -249,6 +249,23 @@ public class TestIPC extends TestCase {
throw new IOException(ERR_MSG);
}
}
private static class LongRTEWritable extends LongWritable {
private final static String ERR_MSG =
"Come across an runtime exception while reading";
LongRTEWritable() {}
LongRTEWritable(long longValue) {
super(longValue);
}
public void readFields(DataInput in) throws IOException {
super.readFields(in);
throw new RuntimeException(ERR_MSG);
}
}
public void testErrorClient() throws Exception {
// start server
Server server = new TestServer(1, false);
@ -269,6 +286,30 @@ public class TestIPC extends TestCase {
}
}
public void testRuntimeExceptionWritable() throws Exception {
// start server
Server server = new TestServer(1, false);
InetSocketAddress addr = NetUtils.getConnectAddress(server);
server.start();
// start client
Client client = new Client(LongRTEWritable.class, conf);
try {
client.call(new LongRTEWritable(RANDOM.nextLong()),
addr, null, null);
fail("Expected an exception to have been thrown");
} catch (IOException e) {
// check error
Throwable cause = e.getCause();
assertTrue(cause instanceof IOException);
// it's double-wrapped
Throwable cause2 = cause.getCause();
assertTrue(cause2 instanceof RuntimeException);
assertEquals(LongRTEWritable.ERR_MSG, cause2.getMessage());
}
}
/**
* Test that, if the socket factory throws an IOE, it properly propagates
* to the client.