From 48b76784cfc4e5f98694fb1627eeaed9ab2a30c6 Mon Sep 17 00:00:00 2001 From: Andrew Purtell Date: Tue, 14 Mar 2017 13:32:12 -0700 Subject: [PATCH] HBASE-17785 RSGroupBasedLoadBalancer fails to assign new table regions when cloning snapshot --- .../hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java | 28 +++++++++++++++------- .../apache/hadoop/hbase/rsgroup/TestRSGroups.java | 19 +++++++++++++++ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java index b917716b28..ea4503d001 100644 --- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java +++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java @@ -65,6 +65,7 @@ import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveTablesR import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RSGroupAdminService; import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveRSGroupRequest; import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveRSGroupResponse; +import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.SnapshotDescription; @InterfaceAudience.Private public class RSGroupAdminEndpoint implements MasterObserver, CoprocessorService { @@ -245,14 +246,7 @@ public class RSGroupAdminEndpoint implements MasterObserver, CoprocessorService } } - ///////////////////////////////////////////////////////////////////////////// - // MasterObserver overrides - ///////////////////////////////////////////////////////////////////////////// - - // Assign table to default RSGroup. - @Override - public void preCreateTable(ObserverContext ctx, - HTableDescriptor desc, HRegionInfo[] regions) throws IOException { + void assignTableToGroup(HTableDescriptor desc) throws IOException { String groupName = master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString()) .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP); @@ -270,6 +264,17 @@ public class RSGroupAdminEndpoint implements MasterObserver, CoprocessorService } } + ///////////////////////////////////////////////////////////////////////////// + // MasterObserver overrides + ///////////////////////////////////////////////////////////////////////////// + + // Assign table to default RSGroup. + @Override + public void preCreateTable(ObserverContext ctx, + HTableDescriptor desc, HRegionInfo[] regions) throws IOException { + assignTableToGroup(desc); + } + // Remove table from its RSGroup. @Override public void postDeleteTable(ObserverContext ctx, @@ -300,5 +305,12 @@ public class RSGroupAdminEndpoint implements MasterObserver, CoprocessorService NamespaceDescriptor ns) throws IOException { preCreateNamespace(ctx, ns); } + + @Override + public void preCloneSnapshot(ObserverContext ctx, + SnapshotDescription snapshot, HTableDescriptor desc) throws IOException { + assignTableToGroup(desc); + } + ///////////////////////////////////////////////////////////////////////////// } diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroups.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroups.java index 38866845ef..d6bd43b4b5 100644 --- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroups.java +++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroups.java @@ -40,6 +40,7 @@ import org.apache.hadoop.hbase.client.ClusterConnection; import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; import org.apache.hadoop.hbase.master.HMaster; import org.apache.hadoop.hbase.master.ServerManager; +import org.apache.hadoop.hbase.master.snapshot.SnapshotManager; import org.apache.hadoop.hbase.net.Address; import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos; @@ -77,6 +78,7 @@ public class TestRSGroups extends TestRSGroupsBase { TEST_UTIL.getConfiguration().set( ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, ""+NUM_SLAVES_BASE); + TEST_UTIL.getConfiguration().setBoolean(SnapshotManager.HBASE_SNAPSHOT_ENABLED, true); admin = TEST_UTIL.getAdmin(); cluster = TEST_UTIL.getHBaseCluster(); @@ -270,4 +272,21 @@ public class TestRSGroups extends TestRSGroupsBase { } }); } + + @Test + public void testCloneSnapshot() throws Exception { + byte[] FAMILY = Bytes.toBytes("test"); + String snapshotName = tableName.getNameAsString() + "_snap"; + TableName clonedTableName = TableName.valueOf(tableName.getNameAsString() + "_clone"); + + // create base table + TEST_UTIL.createTable(tableName, FAMILY); + + // create snapshot + admin.snapshot(snapshotName, tableName); + + // clone + admin.cloneSnapshot(snapshotName, clonedTableName); + } + } -- 2.12.0