Author: hairong
Date: Tue Jan 26 23:00:44 2010
New Revision: 903477
URL: http://svn.apache.org/viewvc?rev=903477&view=rev
Log:
Commit HADOOP-6498 to branch 0.20.
Modified:
hadoop/common/branches/branch-0.20/CHANGES.txt
hadoop/common/branches/branch-0.20/src/core/org/apache/hadoop/ipc/Client.java
hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/ipc/TestIPC.java
Modified: hadoop/common/branches/branch-0.20/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20/CHANGES.txt?rev=903477&r1=903476&r2=903477&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20/CHANGES.txt (original)
+++ hadoop/common/branches/branch-0.20/CHANGES.txt Tue Jan 26 23:00:44 2010
@@ -92,6 +92,9 @@
HDFS-792. DFSClient 0.20.1 is incompatible with HDFS 0.20.2.
(Tod Lipcon via hairong)
+ HADOOP-6498. IPC client bug may cause rpc call hang. (Ruyue Ma and
+ hairong via hairong)
+
Release 0.20.1 - 2009-09-01
INCOMPATIBLE CHANGES
Modified:
hadoop/common/branches/branch-0.20/src/core/org/apache/hadoop/ipc/Client.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20/src/core/org/apache/hadoop/ipc/Client.java?rev=903477&r1=903476&r2=903477&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.20/src/core/org/apache/hadoop/ipc/Client.java
(original)
+++
hadoop/common/branches/branch-0.20/src/core/org/apache/hadoop/ipc/Client.java
Tue Jan 26 23:00:44 2010
@@ -503,13 +503,14 @@
if (LOG.isDebugEnabled())
LOG.debug(getName() + " got value #" + id);
- Call call = calls.remove(id);
+ Call call = calls.get(id);
int state = in.readInt(); // read call status
if (state == Status.SUCCESS.state) {
Writable value = ReflectionUtils.newInstance(valueClass, conf);
value.readFields(in); // read value
call.setValue(value);
+ calls.remove(id);
} else if (state == Status.ERROR.state) {
call.setException(new RemoteException(WritableUtils.readString(in),
WritableUtils.readString(in)));
Modified:
hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/ipc/TestIPC.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/ipc/TestIPC.java?rev=903477&r1=903476&r2=903477&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/ipc/TestIPC.java
(original)
+++
hadoop/common/branches/branch-0.20/src/test/org/apache/hadoop/ipc/TestIPC.java
Tue Jan 26 23:00:44 2010
@@ -26,6 +26,7 @@
import org.apache.hadoop.net.NetUtils;
import java.util.Random;
+import java.io.DataInput;
import java.io.IOException;
import java.net.InetSocketAddress;
@@ -88,7 +89,7 @@
try {
LongWritable param = new LongWritable(RANDOM.nextLong());
LongWritable value =
- (LongWritable)client.call(param, server);
+ (LongWritable)client.call(param, server, null, null);
if (!param.equals(value)) {
LOG.fatal("Call failed!");
failed = true;
@@ -121,7 +122,7 @@
Writable[] params = new Writable[addresses.length];
for (int j = 0; j < addresses.length; j++)
params[j] = new LongWritable(RANDOM.nextLong());
- Writable[] values = client.call(params, addresses);
+ Writable[] values = client.call(params, addresses, null, null);
for (int j = 0; j < addresses.length; j++) {
if (!params[j].equals(values[j])) {
LOG.fatal("Call failed!");
@@ -216,7 +217,7 @@
InetSocketAddress address = new InetSocketAddress("127.0.0.1", 10);
try {
client.call(new LongWritable(RANDOM.nextLong()),
- address);
+ address, null, null);
fail("Expected an exception to have been thrown");
} catch (IOException e) {
String message = e.getMessage();
@@ -231,6 +232,41 @@
}
}
+ private static class LongErrorWritable extends LongWritable {
+ private final static String ERR_MSG =
+ "Come across an exception while reading";
+
+ LongErrorWritable() {}
+
+ LongErrorWritable(long longValue) {
+ super(longValue);
+ }
+
+ public void readFields(DataInput in) throws IOException {
+ super.readFields(in);
+ throw new IOException(ERR_MSG);
+ }
+ }
+
+ public void testErrorClient() throws Exception {
+ // start server
+ Server server = new TestServer(1, false);
+ InetSocketAddress addr = NetUtils.getConnectAddress(server);
+ server.start();
+
+ // start client
+ Client client = new Client(LongErrorWritable.class, conf);
+ try {
+ client.call(new LongErrorWritable(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);
+ assertEquals(LongErrorWritable.ERR_MSG, cause.getMessage());
+ }
+ }
public static void main(String[] args) throws Exception {