From 587b0b4f20bdc0415b6541023e611b69c87dba15 Mon Sep 17 00:00:00 2001 From: Enis Soztutar Date: Sat, 6 Jun 2015 14:01:33 -0700 Subject: [PATCH] HBASE-13851 RpcClientImpl.close() can hang with cancelled replica RPCs --- .../org/apache/hadoop/hbase/ipc/RpcClientImpl.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientImpl.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientImpl.java index 9a5fc14f872..fcfd6201a97 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientImpl.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClientImpl.java @@ -1113,6 +1113,16 @@ public class RpcClientImpl extends AbstractRpcClient { synchronized (connections) { for (Connection conn : connections.values()) { conn.interrupt(); + if (conn.callSender != null) { + conn.callSender.interrupt(); + } + + // In case the CallSender did not setupIOStreams() yet, the Connection may not be started + // at all (if CallSender has a cancelled Call it can happen). See HBASE-13851 + if (!conn.isAlive()) { + conn.markClosed(new InterruptedIOException("RpcClient is closing")); + conn.close(); + } } }