HBASE-17785 RSGroupBasedLoadBalancer fails to assign new table regions when cloning snapshot
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/8d0cd98d Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/8d0cd98d Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/8d0cd98d Branch: refs/heads/HBASE-15631-branch-1 Commit: 8d0cd98dd04b1ca2dbcbb6f5f040643c73b23262 Parents: a860e48 Author: Andrew Purtell <apurt...@apache.org> Authored: Wed Apr 5 16:25:56 2017 -0700 Committer: Andrew Purtell <apurt...@apache.org> Committed: Wed Jul 19 15:32:37 2017 -0700 ---------------------------------------------------------------------- .../hbase/rsgroup/RSGroupAdminEndpoint.java | 28 +++++++++++++++++--- .../hadoop/hbase/rsgroup/TestRSGroups.java | 22 +++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/8d0cd98d/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java ---------------------------------------------------------------------- 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 00cd6b0..8fa9fdc 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 @@ -77,7 +77,6 @@ import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveRSGro import org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveRSGroupResponse; import org.apache.hadoop.hbase.protobuf.generated.SnapshotProtos.SnapshotDescription; - public class RSGroupAdminEndpoint extends RSGroupAdminService implements CoprocessorService, Coprocessor, MasterObserver { @@ -274,12 +273,36 @@ public class RSGroupAdminEndpoint extends RSGroupAdminService done.run(builder.build()); } + void assignTableToGroup(HTableDescriptor desc) throws IOException { + String groupName = + master.getNamespaceDescriptor(desc.getTableName().getNamespaceAsString()) + .getConfigurationValue(RSGroupInfo.NAMESPACEDESC_PROP_GROUP); + if (groupName == null) { + groupName = RSGroupInfo.DEFAULT_GROUP; + } + RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName); + if (rsGroupInfo == null) { + throw new ConstraintException("Default RSGroup (" + groupName + ") for this table's " + + "namespace does not exist."); + } + if (!rsGroupInfo.containsTable(desc.getTableName())) { + groupAdminServer.moveTables(Sets.newHashSet(desc.getTableName()), groupName); + } + } + + ///////////////////////////////////////////////////////////////////////////// + // MasterObserver overrides + ///////////////////////////////////////////////////////////////////////////// + + // Assign table to default RSGroup. @Override public void preCreateTable(ObserverContext<MasterCoprocessorEnvironment> ctx, HTableDescriptor desc, HRegionInfo[] regions) throws IOException { groupAdminServer.prepareRSGroupForTable(desc); + assignTableToGroup(desc); } + // Remove table from its RSGroup. @Override public void postDeleteTable(ObserverContext<MasterCoprocessorEnvironment> ctx, TableName tableName) throws IOException { @@ -663,7 +686,7 @@ public class RSGroupAdminEndpoint extends RSGroupAdminService public void preCloneSnapshot(ObserverContext<MasterCoprocessorEnvironment> ctx, SnapshotDescription snapshot, HTableDescriptor hTableDescriptor) throws IOException { - + assignTableToGroup(hTableDescriptor); } @Override @@ -951,5 +974,4 @@ public class RSGroupAdminEndpoint extends RSGroupAdminService } - } http://git-wip-us.apache.org/repos/asf/hbase/blob/8d0cd98d/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroups.java ---------------------------------------------------------------------- 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 34add63..e5a1f6a 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 @@ -39,6 +39,7 @@ import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; import org.apache.hadoop.hbase.master.HMaster; import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.master.ServerManager; +import org.apache.hadoop.hbase.master.snapshot.SnapshotManager; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.generated.AdminProtos; import org.apache.hadoop.hbase.testclassification.MediumTests; @@ -90,6 +91,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.getHBaseAdmin(); cluster = TEST_UTIL.getHBaseCluster(); @@ -284,4 +286,24 @@ public class TestRSGroups extends TestRSGroupsBase { } }); } + + @Test + public void testCloneSnapshot() throws Exception { + final TableName tableName = TableName.valueOf(tablePrefix+"_testCloneSnapshot"); + LOG.info("testCloneSnapshot"); + + 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); + } + }