Repository: hbase Updated Branches: refs/heads/branch-2 4bcb560e2 -> 28d09cedc
HBASE-20182 Addendum throw IOException instead of NoServerForRegionException because it is a DoNotRetryRegionException Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/28d09ced Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/28d09ced Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/28d09ced Branch: refs/heads/branch-2 Commit: 28d09cedcfac5b9b6e07ea54fd352541cc9a6f14 Parents: 4bcb560 Author: zhangduo <zhang...@apache.org> Authored: Wed Apr 11 14:37:56 2018 +0800 Committer: zhangduo <zhang...@apache.org> Committed: Wed Apr 11 14:47:41 2018 +0800 ---------------------------------------------------------------------- .../org/apache/hadoop/hbase/HRegionInfo.java | 8 ++++--- .../hbase/client/AsyncNonMetaRegionLocator.java | 23 ++++++++++---------- .../hbase/client/ConnectionImplementation.java | 4 ++-- .../hadoop/hbase/client/RegionInfoBuilder.java | 8 ++++--- 4 files changed, 24 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/28d09ced/hbase-client/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java index e2982bd..fc03926 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java @@ -159,9 +159,11 @@ public class HRegionInfo implements RegionInfo, Comparable<HRegionInfo> { } private byte [] endKey = HConstants.EMPTY_BYTE_ARRAY; - // This flag is in the parent of a split while the parent is still referenced - // by daughter regions. We USED to set this flag when we disabled a table - // but now table state is kept up in zookeeper as of 0.90.0 HBase. + // This flag is in the parent of a split while the parent is still referenced by daughter regions. + // We USED to set this flag when we disabled a table but now table state is kept up in zookeeper + // as of 0.90.0 HBase. And now in DisableTableProcedure, finally we will create bunch of + // UnassignProcedures and at the last of the procedure we will set the region state to CLOSED, and + // will not change the offLine flag. private boolean offLine = false; private long regionId = -1; private transient byte [] regionName = HConstants.EMPTY_BYTE_ARRAY; http://git-wip-us.apache.org/repos/asf/hbase/blob/28d09ced/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java index c30de9a..7634b10 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java @@ -269,12 +269,7 @@ class AsyncNonMetaRegionLocator { } // return whether we should stop the scan - private boolean onScanNext(TableName tableName, LocateRequest req, Result result, - Throwable error) { - if (error != null) { - complete(tableName, req, null, error); - return true; - } + private boolean onScanNext(TableName tableName, LocateRequest req, Result result) { RegionLocations locs = MetaTableAccessor.getRegionLocations(result); LOG.debug("The fetched location of '{}', row='{}', locateType={} is {}", tableName, Bytes.toStringBinary(req.row), req.locateType, locs); @@ -298,7 +293,7 @@ class AsyncNonMetaRegionLocator { } if (loc.getServerName() == null) { complete(tableName, req, null, - new NoServerForRegionException( + new IOException( String.format("No server address listed for region '%s', row='%s', locateType=%s", info.getRegionNameAsString(), Bytes.toStringBinary(req.row), req.locateType))); return true; @@ -370,22 +365,28 @@ class AsyncNonMetaRegionLocator { private boolean completeNormally = false; + private boolean tableNotFound = true; + @Override public void onError(Throwable error) { - onScanNext(tableName, req, null, error); + complete(tableName, req, null, error); } @Override public void onComplete() { - if (!completeNormally) { - onScanNext(tableName, req, null, new TableNotFoundException(tableName)); + if (tableNotFound) { + complete(tableName, req, null, new TableNotFoundException(tableName)); + } else if (!completeNormally) { + complete(tableName, req, null, new IOException( + "Unable to find region for " + Bytes.toStringBinary(req.row) + " in " + tableName)); } } @Override public void onNext(Result[] results, ScanController controller) { for (Result result : results) { - if (onScanNext(tableName, req, result, null)) { + tableNotFound = false; + if (onScanNext(tableName, req, result)) { completeNormally = true; controller.terminate(); return; http://git-wip-us.apache.org/repos/asf/hbase/blob/28d09ced/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java ---------------------------------------------------------------------- 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 a272ffb..53e4b7f 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 @@ -836,7 +836,7 @@ class ConnectionImplementation implements ClusterConnection, Closeable { if (tableNotFound) { throw new TableNotFoundException(tableName); } else { - throw new NoServerForRegionException( + throw new IOException( "Unable to find region for " + Bytes.toStringBinary(row) + " in " + tableName); } } @@ -864,7 +864,7 @@ class ConnectionImplementation implements ClusterConnection, Closeable { // the parent in the above condition, so we may have already reached a region which does // not contains us. if (!regionInfo.containsRow(row)) { - throw new NoServerForRegionException( + throw new IOException( "Unable to find region for " + Bytes.toStringBinary(row) + " in " + tableName); } ServerName serverName = locations.getRegionLocation(replicaId).getServerName(); http://git-wip-us.apache.org/repos/asf/hbase/blob/28d09ced/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionInfoBuilder.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionInfoBuilder.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionInfoBuilder.java index fc35afb..3de9860 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionInfoBuilder.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionInfoBuilder.java @@ -149,9 +149,11 @@ public class RegionInfoBuilder { * old region name format. */ - // This flag is in the parent of a split while the parent is still referenced - // by daughter regions. We USED to set this flag when we disabled a table - // but now table state is kept up in zookeeper as of 0.90.0 HBase. + // This flag is in the parent of a split while the parent is still referenced by daughter + // regions. We USED to set this flag when we disabled a table but now table state is kept up in + // zookeeper as of 0.90.0 HBase. And now in DisableTableProcedure, finally we will create bunch + // of UnassignProcedures and at the last of the procedure we will set the region state to + // CLOSED, and will not change the offLine flag. private boolean offLine = false; private boolean split = false; private final long regionId;