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
   *

Reply via email to