You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2019/09/16 17:31:58 UTC

[hbase] branch branch-2 updated: HBASE-22700 refactor isMetaClearingException (#578)

This is an automated email from the ASF dual-hosted git repository.

stack pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2 by this push:
     new 5ccab83  HBASE-22700 refactor isMetaClearingException (#578)
5ccab83 is described below

commit 5ccab83d6c7f65c7169f74c51c58df48b2cef80e
Author: johnhomsea <51...@qq.com>
AuthorDate: Tue Sep 17 01:31:52 2019 +0800

    HBASE-22700 refactor isMetaClearingException (#578)
---
 .../hbase/client/AsyncRegionLocatorHelper.java     |  4 ++-
 .../hbase/client/AsyncRequestFutureImpl.java       |  6 +++--
 .../hbase/client/ConnectionImplementation.java     |  3 ++-
 .../hbase/exceptions/ClientExceptionsUtil.java     | 31 ++++++++++++++--------
 .../apache/hadoop/hbase/client/TestMetaCache.java  | 10 +++++--
 5 files changed, 37 insertions(+), 17 deletions(-)

diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncRegionLocatorHelper.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncRegionLocatorHelper.java
index 5f4bc9f..a4191d9 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncRegionLocatorHelper.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncRegionLocatorHelper.java
@@ -19,6 +19,7 @@ package org.apache.hadoop.hbase.client;
 
 import static org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil.findException;
 import static org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil.isMetaClearingException;
+import static org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil.isRegionServerOverloadedException;
 
 import java.util.Arrays;
 import java.util.Optional;
@@ -67,7 +68,8 @@ final class AsyncRegionLocatorHelper {
       LOG.debug("The actual exception when updating {} is {}", loc,
         cause != null ? cause.toString() : "none");
     }
-    if (cause == null || !isMetaClearingException(cause)) {
+    if (cause == null || !isMetaClearingException(cause)
+        || isRegionServerOverloadedException(cause)) {
       LOG.debug("Will not update {} because the exception is null or not the one we care about",
         loc);
       return;
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.java
index e46a50e..c76cd0b 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.java
@@ -711,7 +711,8 @@ class AsyncRequestFutureImpl<CResult> implements AsyncRequestFuture {
       // Do not use the exception for updating cache because it might be coming from
       // any of the regions in the MultiAction.
       updateCachedLocations(server, regionName, row,
-        ClientExceptionsUtil.isMetaClearingException(t) ? null : t);
+        ClientExceptionsUtil.isMetaClearingException(t) &&
+            !ClientExceptionsUtil.isRegionServerOverloadedException(t) ? null : t);
       for (Action action : e.getValue()) {
         Retry retry = manageError(
             action.getOriginalIndex(), action.getAction(), canRetry, t, server);
@@ -913,7 +914,8 @@ class AsyncRequestFutureImpl<CResult> implements AsyncRequestFuture {
   }
 
   private void cleanServerCache(ServerName server, Throwable regionException) {
-    if (ClientExceptionsUtil.isMetaClearingException(regionException)) {
+    if (ClientExceptionsUtil.isMetaClearingException(regionException)
+        && !ClientExceptionsUtil.isRegionServerOverloadedException(regionException)) {
       // We want to make sure to clear the cache in case there were location-related exceptions.
       // We don't to clear the cache for every possible exception that comes through, however.
       asyncProcess.connection.clearCaches(server);
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java
index 39f7abf..c0b6862 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java
@@ -1932,7 +1932,8 @@ class ConnectionImplementation implements ClusterConnection, Closeable {
     RegionInfo regionInfo = oldLocation.getRegion();
     Throwable cause = ClientExceptionsUtil.findException(exception);
     if (cause != null) {
-      if (!ClientExceptionsUtil.isMetaClearingException(cause)) {
+      if (!ClientExceptionsUtil.isMetaClearingException(cause)
+          || ClientExceptionsUtil.isRegionServerOverloadedException(cause)) {
         // We know that the region is still on this region server
         return;
       }
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/exceptions/ClientExceptionsUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/exceptions/ClientExceptionsUtil.java
index 6b1e251..e330c3c 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/exceptions/ClientExceptionsUtil.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/exceptions/ClientExceptionsUtil.java
@@ -32,7 +32,6 @@ import java.util.concurrent.TimeoutException;
 import org.apache.hadoop.hbase.CallDroppedException;
 import org.apache.hadoop.hbase.CallQueueTooBigException;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
-import org.apache.hadoop.hbase.MultiActionResultTooLarge;
 import org.apache.hadoop.hbase.NotServingRegionException;
 import org.apache.hadoop.hbase.RegionTooBusyException;
 import org.apache.hadoop.hbase.RetryImmediatelyException;
@@ -59,18 +58,28 @@ public final class ClientExceptionsUtil {
     if (cur == null) {
       return true;
     }
-    return !isSpecialException(cur) || (cur instanceof RegionMovedException)
-        || cur instanceof NotServingRegionException;
+    return !isMetaCachePreservingException(cur);
   }
 
-  public static boolean isSpecialException(Throwable cur) {
-    return (cur instanceof RegionMovedException || cur instanceof RegionOpeningException
-        || cur instanceof RegionTooBusyException || cur instanceof RpcThrottlingException
-        || cur instanceof MultiActionResultTooLarge || cur instanceof RetryImmediatelyException
-        || cur instanceof CallQueueTooBigException || cur instanceof CallDroppedException
-        || cur instanceof NotServingRegionException || cur instanceof RequestTooBigException);
+  public static boolean isRegionServerOverloadedException(Throwable t) {
+    t = findException(t);
+    return isInstanceOfRegionServerOverloadedException(t);
+  }
+
+  private static boolean isInstanceOfRegionServerOverloadedException(Throwable t) {
+    return t instanceof CallQueueTooBigException || t instanceof CallDroppedException;
   }
 
+  private static boolean isMetaCachePreservingException(Throwable t) {
+    return t instanceof RegionOpeningException || t instanceof RegionTooBusyException
+        || t instanceof RpcThrottlingException || t instanceof RetryImmediatelyException
+        || t instanceof RequestTooBigException;
+  }
+
+  private static boolean isExceptionWeCare(Throwable t) {
+    return isMetaCachePreservingException(t) || isInstanceOfRegionServerOverloadedException(t)
+        || t instanceof NotServingRegionException;
+  }
 
   /**
    * Look for an exception we know in the remote exception:
@@ -87,7 +96,7 @@ public final class ClientExceptionsUtil {
     }
     Throwable cur = (Throwable) exception;
     while (cur != null) {
-      if (isSpecialException(cur)) {
+      if (isExceptionWeCare(cur)) {
         return cur;
       }
       if (cur instanceof RemoteException) {
@@ -95,7 +104,7 @@ public final class ClientExceptionsUtil {
         cur = re.unwrapRemoteException();
 
         // unwrapRemoteException can return the exception given as a parameter when it cannot
-        //  unwrap it. In this case, there is no need to look further
+        // unwrap it. In this case, there is no need to look further
         // noinspection ObjectEquality
         if (cur == re) {
           return cur;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMetaCache.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMetaCache.java
index 3870244..f159ab8 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMetaCache.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMetaCache.java
@@ -27,6 +27,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.CallDroppedException;
 import org.apache.hadoop.hbase.CallQueueTooBigException;
 import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
@@ -40,6 +41,7 @@ import org.apache.hadoop.hbase.RetryImmediatelyException;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil;
 import org.apache.hadoop.hbase.exceptions.RegionOpeningException;
+import org.apache.hadoop.hbase.exceptions.RequestTooBigException;
 import org.apache.hadoop.hbase.quotas.RpcThrottlingException;
 import org.apache.hadoop.hbase.regionserver.HRegionServer;
 import org.apache.hadoop.hbase.regionserver.RSRpcServices;
@@ -143,12 +145,14 @@ public class TestMetaCache {
           table.mutateRow(mutations);
         } catch (IOException ex) {
           // Only keep track of the last exception that updated the meta cache
-          if (ClientExceptionsUtil.isMetaClearingException(ex) || success) {
+          if ((ClientExceptionsUtil.isMetaClearingException(ex)
+              && !ClientExceptionsUtil.isRegionServerOverloadedException(ex)) || success) {
             exp = ex;
           }
         }
         // Do not test if we did not touch the meta cache in this iteration.
-        if (exp != null && ClientExceptionsUtil.isMetaClearingException(exp)) {
+        if (exp != null && ClientExceptionsUtil.isMetaClearingException(exp)
+            && !ClientExceptionsUtil.isRegionServerOverloadedException(exp)) {
           assertNull(conn.getCachedLocation(TABLE_NAME, row));
         } else if (success) {
           assertNotNull(conn.getCachedLocation(TABLE_NAME, row));
@@ -207,7 +211,9 @@ public class TestMetaCache {
         add(new RpcThrottlingException(" "));
         add(new MultiActionResultTooLarge(" "));
         add(new RetryImmediatelyException(" "));
+        add(new RequestTooBigException());
         add(new CallQueueTooBigException());
+        add(new CallDroppedException());
     }};
   }