From 1237a8505260d0d520211af930eddc2455370f52 Mon Sep 17 00:00:00 2001 From: ndimiduk Date: Thu, 6 Mar 2014 17:35:33 +0000 Subject: [PATCH] HBASE-10432 Rpc retries non-recoverable error git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1574973 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/hadoop/hbase/client/RpcRetryingCaller.java | 3 +++ .../main/java/org/apache/hadoop/hbase/ipc/RpcClient.java | 6 +++++- .../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 d6ad5066065..086a288d54b 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 @@ -187,6 +187,9 @@ public class RpcRetryingCaller { if (t instanceof RemoteException) { t = ((RemoteException)t).unwrapRemoteException(); } + if (t instanceof LinkageError) { + 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 d20f376d9cd..8e86a1565f1 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 @@ -33,6 +33,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; @@ -961,7 +962,10 @@ public class RpcClient { IOException e = ExceptionUtil.asInterrupt(t); if (e == null) { failedServers.addToFailedServers(remoteId.address); - if (t instanceof IOException) { + if (t instanceof LinkageError) { + // probably the hbase hadoop version does not match the running hadoop version + e = new DoNotRetryIOException(t); + } else if (t instanceof IOException) { e = (IOException) t; } else { e = new IOException("Could not set up IO Streams to " + server, t); 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 4a2c9f089b8..15f9618f78f 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 @@ -1719,6 +1719,10 @@ public class RpcServer implements RpcServerInterface { String msg = "Unable to read call parameter from client " + getHostAddress(); LOG.warn(msg, t); + // probably the hbase hadoop version does not match the running hadoop version + if (t instanceof LinkageError) { + t = new DoNotRetryIOException(t); + } // If the method is not present on the server, do not retry. if (t instanceof UnsupportedOperationException) { t = new DoNotRetryIOException(t); @@ -2048,6 +2052,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 LinkageError) throw new DoNotRetryIOException(e); if (e instanceof IOException) throw (IOException)e; LOG.error("Unexpected throwable object ", e); throw new IOException(e.getMessage(), e);