Repository: hbase Updated Branches: refs/heads/branch-1 a28f048fb -> 7b3d0add6
HBASE-11631 Wait a little till server is online in assigning meta Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/7b3d0add Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/7b3d0add Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/7b3d0add Branch: refs/heads/branch-1 Commit: 7b3d0add6067dc935684e9a9c47a8fca8eb1c23d Parents: a28f048 Author: Jimmy Xiang <[email protected]> Authored: Thu Jul 31 10:03:35 2014 -0700 Committer: Jimmy Xiang <[email protected]> Committed: Fri Aug 1 12:34:41 2014 -0700 ---------------------------------------------------------------------- .../hbase/regionserver/RSRpcServices.java | 39 +++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/7b3d0add/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java index e974de6..04e7995 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java @@ -139,6 +139,7 @@ import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionActionResul import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ResultOrException; import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanRequest; import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanResponse; +import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionInfo; import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier; import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType; import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader; @@ -1181,14 +1182,10 @@ public class RSRpcServices implements HBaseRPCErrorHandler, * @throws ServiceException */ @Override + @SuppressWarnings("deprecation") @QosPriority(priority=HConstants.HIGH_QOS) public OpenRegionResponse openRegion(final RpcController controller, final OpenRegionRequest request) throws ServiceException { - try { - checkOpen(); - } catch (IOException ie) { - throw new ServiceException(ie); - } requestCount.increment(); if (request.hasServerStartCode()) { // check that we are the same server that this RPC is intended for. @@ -1205,6 +1202,38 @@ public class RSRpcServices implements HBaseRPCErrorHandler, final Map<TableName, HTableDescriptor> htds = new HashMap<TableName, HTableDescriptor>(regionCount); final boolean isBulkAssign = regionCount > 1; + try { + checkOpen(); + } catch (IOException ie) { + TableName tableName = null; + if (regionCount == 1) { + RegionInfo ri = request.getOpenInfo(0).getRegion(); + if (ri != null) { + tableName = ProtobufUtil.toTableName(ri.getTableName()); + } + } + if (!TableName.META_TABLE_NAME.equals(tableName)) { + throw new ServiceException(ie); + } + // We are assigning meta, wait a little for regionserver to finish initialization. + int timeout = regionServer.conf.getInt(HConstants.HBASE_RPC_TIMEOUT_KEY, + HConstants.DEFAULT_HBASE_RPC_TIMEOUT) >> 2; // Quarter of RPC timeout + long endTime = System.currentTimeMillis() + timeout; + synchronized (regionServer.online) { + try { + while (System.currentTimeMillis() <= endTime + && !regionServer.isStopped() && !regionServer.isOnline()) { + regionServer.online.wait(100); + } + checkOpen(); + } catch (InterruptedException t) { + Thread.currentThread().interrupt(); + throw new ServiceException(t); + } catch (IOException e) { + throw new ServiceException(e); + } + } + } for (RegionOpenInfo regionOpenInfo : request.getOpenInfoList()) { final HRegionInfo region = HRegionInfo.convert(regionOpenInfo.getRegion()); OpenRegionCoordination coordination = regionServer.getCoordinatedStateManager().
