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:
parent
70d7790cef
commit
2786e80436
|
@ -1569,6 +1569,9 @@ Release 0.21.0 - Unreleased
|
||||||
despite failure at any level. (Contributed by Ravi Gummadi and
|
despite failure at any level. (Contributed by Ravi Gummadi and
|
||||||
Vinod Kumar Vavilapalli)
|
Vinod Kumar Vavilapalli)
|
||||||
|
|
||||||
|
HADOOP-6723. Unchecked exceptions thrown in IPC Connection should not
|
||||||
|
orphan clients. (Todd Lipcon via tomwhite)
|
||||||
|
|
||||||
Release 0.20.3 - Unreleased
|
Release 0.20.3 - Unreleased
|
||||||
|
|
||||||
NEW FEATURES
|
NEW FEATURES
|
||||||
|
|
|
@ -602,9 +602,17 @@ public class Client {
|
||||||
LOG.debug(getName() + ": starting, having connections "
|
LOG.debug(getName() + ": starting, having connections "
|
||||||
+ connections.size());
|
+ connections.size());
|
||||||
|
|
||||||
|
try {
|
||||||
while (waitForWork()) {//wait here for work - read or close connection
|
while (waitForWork()) {//wait here for work - read or close connection
|
||||||
receiveResponse();
|
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();
|
close();
|
||||||
|
|
||||||
|
|
|
@ -249,6 +249,23 @@ public class TestIPC extends TestCase {
|
||||||
throw new IOException(ERR_MSG);
|
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 {
|
public void testErrorClient() throws Exception {
|
||||||
// start server
|
// start server
|
||||||
Server server = new TestServer(1, false);
|
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
|
* Test that, if the socket factory throws an IOE, it properly propagates
|
||||||
* to the client.
|
* to the client.
|
||||||
|
|
Loading…
Reference in New Issue