Repository: hbase Updated Branches: refs/heads/branch-2 9e6871901 -> 75a8e53ce
HBASE-20500 [rsgroup] should keep at least one server in default group Signed-off-by: tedyu <yuzhih...@gmail.com> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/75a8e53c Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/75a8e53c Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/75a8e53c Branch: refs/heads/branch-2 Commit: 75a8e53ce84c38fd06086560d87ba93b543ae5f1 Parents: 9e68719 Author: Yechao Chen <chenyec...@gmail.com> Authored: Tue May 8 14:04:59 2018 +0800 Committer: tedyu <yuzhih...@gmail.com> Committed: Tue May 8 08:35:17 2018 -0700 ---------------------------------------------------------------------- .../hbase/rsgroup/RSGroupAdminServer.java | 5 +++ .../hadoop/hbase/rsgroup/TestRSGroupsBase.java | 47 ++++++++++++++++++++ 2 files changed, 52 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/75a8e53c/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminServer.java ---------------------------------------------------------------------- diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminServer.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminServer.java index f7e7731..9b58834 100644 --- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminServer.java +++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminServer.java @@ -56,6 +56,8 @@ import org.apache.hbase.thirdparty.com.google.common.collect.Maps; @InterfaceAudience.Private public class RSGroupAdminServer implements RSGroupAdmin { private static final Logger LOG = LoggerFactory.getLogger(RSGroupAdminServer.class); + public static final String KEEP_ONE_SERVER_IN_DEFAULT_ERROR_MESSAGE = "should keep at least " + + "one server in 'default' RSGroup."; private MasterServices master; private final RSGroupInfoManager rsGroupInfoManager; @@ -307,6 +309,9 @@ public class RSGroupAdminServer implements RSGroupAdmin { // Only move online servers (when moving from 'default') or servers from other // groups. This prevents bogus servers from entering groups if (RSGroupInfo.DEFAULT_GROUP.equals(srcGrp.getName())) { + if (srcGrp.getServers().size() <= servers.size()) { + throw new ConstraintException(KEEP_ONE_SERVER_IN_DEFAULT_ERROR_MESSAGE); + } checkOnlineServersOnly(servers); } // Ensure all servers are of same rsgroup. http://git-wip-us.apache.org/repos/asf/hbase/blob/75a8e53c/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java ---------------------------------------------------------------------- diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java index 9422bf8..e70a88b 100644 --- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java +++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.java @@ -339,6 +339,53 @@ public abstract class TestRSGroupsBase { } @Test + public void testMoveServersFromDefaultGroup() throws Exception { + //create groups and assign servers + rsGroupAdmin.addRSGroup("foo"); + + RSGroupInfo fooGroup = rsGroupAdmin.getRSGroupInfo("foo"); + assertEquals(0, fooGroup.getServers().size()); + RSGroupInfo defaultGroup = rsGroupAdmin.getRSGroupInfo(RSGroupInfo.DEFAULT_GROUP); + + //test remove all servers from default + try { + rsGroupAdmin.moveServers(defaultGroup.getServers(), fooGroup.getName()); + fail(RSGroupAdminServer.KEEP_ONE_SERVER_IN_DEFAULT_ERROR_MESSAGE); + } catch (ConstraintException ex) { + assertTrue(ex.getMessage().contains(RSGroupAdminServer + .KEEP_ONE_SERVER_IN_DEFAULT_ERROR_MESSAGE)); + } + + //test success case, remove one server from default ,keep at least one server + if (defaultGroup.getServers().size() > 1) { + Address serverInDefaultGroup = defaultGroup.getServers().iterator().next(); + LOG.info("moving server " + serverInDefaultGroup + " from group default to group " + + fooGroup.getName()); + rsGroupAdmin.moveServers(Sets.newHashSet(serverInDefaultGroup), fooGroup.getName()); + } + + fooGroup = rsGroupAdmin.getRSGroupInfo("foo"); + LOG.info("moving servers " + fooGroup.getServers() + " to group default"); + rsGroupAdmin.moveServers(fooGroup.getServers(), RSGroupInfo.DEFAULT_GROUP); + + TEST_UTIL.waitFor(WAIT_TIMEOUT, new Waiter.Predicate<Exception>() { + @Override + public boolean evaluate() throws Exception { + return getNumServers() == + rsGroupAdmin.getRSGroupInfo(RSGroupInfo.DEFAULT_GROUP).getServers().size(); + } + }); + + fooGroup = rsGroupAdmin.getRSGroupInfo("foo"); + assertEquals(0, fooGroup.getServers().size()); + + //test group removal + LOG.info("Remove group " + fooGroup.getName()); + rsGroupAdmin.removeRSGroup(fooGroup.getName()); + Assert.assertEquals(null, rsGroupAdmin.getRSGroupInfo(fooGroup.getName())); + } + + @Test public void testTableMoveTruncateAndDrop() throws Exception { final byte[] familyNameBytes = Bytes.toBytes("f"); String newGroupName = getGroupName(name.getMethodName());