HBASE-13316 Reduce the downtime on planned moves of regions Summary: The current behavior of a region move shuts down a region and then starts is up in another regionserver. This causes increased latency and possibly timeouts till the new region's cache is fully warmed up. We can make a region move less disruptive by warming the cache in the destination region server before shutting dow the old region.
See https://issues.apache.org/jira/browse/HBASE-13316 Test Plan: 1. Unit Tests 2. Added test for concurrent moves and warmups 3. Manually tested reads/writes happening with concurrent moves Subscribers: tedyu Differential Revision: https://reviews.facebook.net/D35967 Signed-off-by: Elliott Clark <ecl...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/ba6345f7 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/ba6345f7 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/ba6345f7 Branch: refs/heads/master Commit: ba6345f7d15d540943825a2b6f2d2c2177ad1c8c Parents: 5d2c331 Author: Sameet Agarwal <sam...@sameet-mba.dhcp.thefacebook.com> Authored: Thu Mar 12 10:56:58 2015 -0700 Committer: Elliott Clark <ecl...@apache.org> Committed: Fri Mar 27 11:48:01 2015 -0700 ---------------------------------------------------------------------- .../hadoop/hbase/protobuf/ProtobufUtil.java | 22 + .../hadoop/hbase/protobuf/RequestConverter.java | 11 + .../hbase/protobuf/generated/AdminProtos.java | 1282 ++++++++++++++++-- hbase-protocol/src/main/protobuf/Admin.proto | 11 + .../hadoop/hbase/master/AssignmentManager.java | 1 + .../org/apache/hadoop/hbase/master/HMaster.java | 5 + .../hadoop/hbase/master/ServerManager.java | 21 + .../hadoop/hbase/regionserver/HRegion.java | 47 +- .../hbase/regionserver/RSRpcServices.java | 53 + .../hadoop/hbase/master/MockRegionServer.java | 8 + .../hadoop/hbase/master/TestWarmupRegion.java | 164 +++ 11 files changed, 1477 insertions(+), 148 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/ba6345f7/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java index 8e027de..8b5b2d7 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java @@ -85,6 +85,7 @@ import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.MergeRegionsReques import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.OpenRegionRequest; import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ServerInfo; import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.SplitRegionRequest; +import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.WarmupRegionRequest; import org.apache.hadoop.hbase.protobuf.generated.AuthenticationProtos; import org.apache.hadoop.hbase.protobuf.generated.CellProtos; import org.apache.hadoop.hbase.protobuf.generated.ClientProtos; @@ -1728,6 +1729,26 @@ public final class ProtobufUtil { } } + /** + * A helper to warmup a region given a region name + * using admin protocol + * + * @param admin + * @param regionInfo + * + */ + public static void warmupRegion(final AdminService.BlockingInterface admin, + final HRegionInfo regionInfo) throws IOException { + + try { + WarmupRegionRequest warmupRegionRequest = + RequestConverter.buildWarmupRegionRequest(regionInfo); + + admin.warmupRegion(null, warmupRegionRequest); + } catch (ServiceException e) { + throw getRemoteException(e); + } + } /** * A helper to open a region using admin protocol. @@ -1746,6 +1767,7 @@ public final class ProtobufUtil { } } + /** * A helper to get the all the online regions on a region * server using admin protocol. http://git-wip-us.apache.org/repos/asf/hbase/blob/ba6345f7/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java index 02ad908..f92d901 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java @@ -46,6 +46,7 @@ import org.apache.hadoop.hbase.exceptions.DeserializationException; import org.apache.hadoop.hbase.filter.ByteArrayComparable; import org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos; import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CloseRegionRequest; +import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.WarmupRegionRequest; import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CompactRegionRequest; import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.FlushRegionRequest; import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetOnlineRegionRequest; @@ -849,6 +850,16 @@ public final class RequestConverter { return builder.build(); } + /** + * Create a WarmupRegionRequest for a given region name + * + * @param regionInfo Region we are warming up + */ + public static WarmupRegionRequest buildWarmupRegionRequest(final HRegionInfo regionInfo) { + WarmupRegionRequest.Builder builder = WarmupRegionRequest.newBuilder(); + builder.setRegionInfo(HRegionInfo.convert(regionInfo)); + return builder.build(); + } /** * Create a CloseRegionRequest for a given encoded region name *