From b0c9a17537483273b1de09a4f862579c3d427d57 Mon Sep 17 00:00:00 2001 From: chenheng Date: Fri, 29 Apr 2016 12:10:29 +0800 Subject: [PATCH] HBASE-15278 AsyncRPCClient hangs if Connection closes before RPC call response --- .../apache/hadoop/hbase/ipc/AsyncRpcChannel.java | 6 ++ .../hbase/ipc/AsyncServerResponseHandler.java | 3 +- .../apache/hadoop/hbase/ipc/AbstractTestIPC.java | 71 +++++++++++++++++++++- 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.java index 53eb824..ef3240c 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.java @@ -210,6 +210,12 @@ public class AsyncRpcChannel { ch.pipeline().addLast("frameDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4)); ch.pipeline().addLast(new AsyncServerResponseHandler(this)); + ch.closeFuture().addListener(new GenericFutureListener() { + @Override + public void operationComplete(ChannelFuture future) throws Exception { + close(null); + } + }); try { writeChannelHeader(ch).addListener(new GenericFutureListener() { @Override diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.java index e0c7586..4cf9cff 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.java @@ -107,7 +107,7 @@ public class AsyncServerResponseHandler extends SimpleChannelInboundHandler of(CELL))), md, param, + md.getOutputType().toProto(), User.getCurrent(), address, + new MetricsConnection.CallStats()); + fail("RPC should have failed because server closed connection"); + } catch(IOException ex) { + // pass + } + } finally { + rpcServer.stop(); + } + } + /** * Instance of RpcServer that echoes client hostAddress back to client */ -- 1.9.3 (Apple Git-50)