From d12bdeac6f9389cf3a7c028bab697d2242a576d6 Mon Sep 17 00:00:00 2001 From: Nick Dimiduk Date: Fri, 31 Jan 2014 09:05:09 -0800 Subject: [PATCH] HBASE-10432 Rpc retries non-recoverable error --- .../main/java/org/apache/hadoop/hbase/client/RpcRetryingCaller.java | 3 +++ .../src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java | 6 +++++- .../src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCaller.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCaller.java index b27123a..fc2825d 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCaller.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCaller.java @@ -211,6 +211,9 @@ public class RpcRetryingCaller { if (t instanceof RemoteException) { t = ((RemoteException)t).unwrapRemoteException(); } + if (t instanceof Error) { + throw new DoNotRetryIOException(t); + } if (t instanceof ServiceException) { ServiceException se = (ServiceException)t; Throwable cause = se.getCause(); diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java index 81722cf..c53f772 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ipc/RpcClient.java @@ -55,6 +55,7 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.CellScanner; +import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.HBaseIOException; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.ServerName; @@ -915,7 +916,10 @@ public class RpcClient { } catch (Throwable t) { failedServers.addToFailedServers(remoteId.address); IOException e = null; - if (t instanceof IOException) { + if (t instanceof Error) { + // something serious happened. Do not retry + e = new DoNotRetryIOException(t); + } else if (t instanceof IOException) { e = (IOException)t; markClosed(e); } else { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java index d7be74a..60c7544 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java @@ -1711,6 +1711,10 @@ public class RpcServer implements RpcServerInterface { String msg = "Unable to read call parameter from client " + getHostAddress(); LOG.warn(msg, t); + // language-level error happened, do not retry + if (t instanceof Error) { + t = new DoNotRetryIOException(t); + } // If the method is not present on the server, do not retry. if (t instanceof UnsupportedOperationException) { t = new DoNotRetryIOException(t); @@ -2041,6 +2045,7 @@ public class RpcServer implements RpcServerInterface { // putting it on the wire. Its needed to adhere to the pb Service Interface but we don't // need to pass it over the wire. if (e instanceof ServiceException) e = e.getCause(); + if (e instanceof Error) throw new DoNotRetryIOException(e); if (e instanceof IOException) throw (IOException)e; LOG.error("Unexpected throwable object ", e); throw new IOException(e.getMessage(), e); -- 1.8.5.1