HBASE-22700 refactor isMetaClearingException (#501)

This commit is contained in:
johnhomsea 2019-09-18 01:02:37 +08:00 committed by Michael Stack
parent fe74e6e3ac
commit cb62f73406
3 changed files with 31 additions and 15 deletions

View File

@ -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.findException;
import static org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil.isMetaClearingException; 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.Arrays;
import java.util.Optional; import java.util.Optional;
@ -67,7 +68,8 @@ final class AsyncRegionLocatorHelper {
LOG.debug("The actual exception when updating {} is {}", loc, LOG.debug("The actual exception when updating {} is {}", loc,
cause != null ? cause.toString() : "none"); 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", LOG.debug("Will not update {} because the exception is null or not the one we care about",
loc); loc);
return; return;

View File

@ -32,7 +32,6 @@ import java.util.concurrent.TimeoutException;
import org.apache.hadoop.hbase.CallDroppedException; import org.apache.hadoop.hbase.CallDroppedException;
import org.apache.hadoop.hbase.CallQueueTooBigException; import org.apache.hadoop.hbase.CallQueueTooBigException;
import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.DoNotRetryIOException;
import org.apache.hadoop.hbase.MultiActionResultTooLarge;
import org.apache.hadoop.hbase.NotServingRegionException; import org.apache.hadoop.hbase.NotServingRegionException;
import org.apache.hadoop.hbase.RegionTooBusyException; import org.apache.hadoop.hbase.RegionTooBusyException;
import org.apache.hadoop.hbase.RetryImmediatelyException; import org.apache.hadoop.hbase.RetryImmediatelyException;
@ -59,18 +58,28 @@ public final class ClientExceptionsUtil {
if (cur == null) { if (cur == null) {
return true; return true;
} }
return !isSpecialException(cur) || (cur instanceof RegionMovedException) return !isMetaCachePreservingException(cur);
|| cur instanceof NotServingRegionException;
} }
public static boolean isSpecialException(Throwable cur) { public static boolean isRegionServerOverloadedException(Throwable t) {
return (cur instanceof RegionMovedException || cur instanceof RegionOpeningException t = findException(t);
|| cur instanceof RegionTooBusyException || cur instanceof RpcThrottlingException return isInstanceOfRegionServerOverloadedException(t);
|| cur instanceof MultiActionResultTooLarge || cur instanceof RetryImmediatelyException
|| cur instanceof CallQueueTooBigException || cur instanceof CallDroppedException
|| cur instanceof NotServingRegionException || cur instanceof RequestTooBigException);
} }
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: * Look for an exception we know in the remote exception:
@ -87,7 +96,7 @@ public final class ClientExceptionsUtil {
} }
Throwable cur = (Throwable) exception; Throwable cur = (Throwable) exception;
while (cur != null) { while (cur != null) {
if (isSpecialException(cur)) { if (isExceptionWeCare(cur)) {
return cur; return cur;
} }
if (cur instanceof RemoteException) { if (cur instanceof RemoteException) {
@ -95,7 +104,7 @@ public final class ClientExceptionsUtil {
cur = re.unwrapRemoteException(); cur = re.unwrapRemoteException();
// unwrapRemoteException can return the exception given as a parameter when it cannot // 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 // noinspection ObjectEquality
if (cur == re) { if (cur == re) {
return cur; return cur;

View File

@ -27,6 +27,7 @@ import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.CallDroppedException;
import org.apache.hadoop.hbase.CallQueueTooBigException; import org.apache.hadoop.hbase.CallQueueTooBigException;
import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HBaseTestingUtility;
@ -38,6 +39,7 @@ import org.apache.hadoop.hbase.RetryImmediatelyException;
import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil; import org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil;
import org.apache.hadoop.hbase.exceptions.RegionOpeningException; 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.quotas.RpcThrottlingException;
import org.apache.hadoop.hbase.regionserver.HRegionServer; import org.apache.hadoop.hbase.regionserver.HRegionServer;
import org.apache.hadoop.hbase.regionserver.RSRpcServices; import org.apache.hadoop.hbase.regionserver.RSRpcServices;
@ -149,12 +151,14 @@ public class TestMetaCache {
table.mutateRow(mutations); table.mutateRow(mutations);
} catch (IOException ex) { } catch (IOException ex) {
// Only keep track of the last exception that updated the meta cache // 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; exp = ex;
} }
} }
// Do not test if we did not touch the meta cache in this iteration. // 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(locator.getRegionLocationInCache(TABLE_NAME, row)); assertNull(locator.getRegionLocationInCache(TABLE_NAME, row));
} else if (success) { } else if (success) {
assertNotNull(locator.getRegionLocationInCache(TABLE_NAME, row)); assertNotNull(locator.getRegionLocationInCache(TABLE_NAME, row));
@ -199,7 +203,8 @@ public class TestMetaCache {
return Arrays.asList(new RegionOpeningException(" "), return Arrays.asList(new RegionOpeningException(" "),
new RegionTooBusyException("Some old message"), new RpcThrottlingException(" "), new RegionTooBusyException("Some old message"), new RpcThrottlingException(" "),
new MultiActionResultTooLarge(" "), new RetryImmediatelyException(" "), new MultiActionResultTooLarge(" "), new RetryImmediatelyException(" "),
new CallQueueTooBigException()); new RequestTooBigException(), new CallQueueTooBigException(),
new CallDroppedException());
} }
public static class RegionServerWithFakeRpcServices extends HRegionServer { public static class RegionServerWithFakeRpcServices extends HRegionServer {