From 8b3dc693628204e0ec007aab0fe608b7f1a66347 Mon Sep 17 00:00:00 2001 From: zhengsicheng Date: Fri, 30 Apr 2021 18:10:15 +0800 Subject: [PATCH] HBASE-25634 The client frequently exceeds the quota, which causes the meta table scan to be too high --- .../hadoop/hbase/client/RetriesExhaustedException.java | 4 ++++ .../hadoop/hbase/client/RpcRetryingCallerImpl.java | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RetriesExhaustedException.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RetriesExhaustedException.java index f0df7e09cf91..b4cc8a25c2b1 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RetriesExhaustedException.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RetriesExhaustedException.java @@ -73,6 +73,10 @@ public String toString() { } return joiner.toString(); } + + public Throwable getThrowable() { + return throwable; + } } /** diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.java index fb58bfae9eff..e80cfbdb051c 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.java @@ -33,6 +33,7 @@ import org.apache.hadoop.hbase.CallQueueTooBigException; import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.exceptions.PreemptiveFastFailException; +import org.apache.hadoop.hbase.quotas.RpcThrottlingException; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.ExceptionUtil; import org.apache.hadoop.ipc.RemoteException; @@ -103,7 +104,13 @@ public T callWithRetries(RetryingCallable callable, int callTimeout) long expectedSleep; try { // bad cache entries are cleared in the call to RetryingCallable#throwable() in catch block - callable.prepare(tries != 0); + Throwable t = null; + if (exceptions != null && !exceptions.isEmpty()) { + t = exceptions.get(exceptions.size() - 1).getThrowable(); + } + if (!(t instanceof RpcThrottlingException)) { + callable.prepare(tries != 0); + } interceptor.intercept(context.prepare(callable, tries)); return callable.call(getTimeout(callTimeout)); } catch (PreemptiveFastFailException e) {