From 6972d0f981e95820f0e2a97f2bd48eba67e213e1 Mon Sep 17 00:00:00 2001 From: Yechao Chen Date: Sat, 28 Apr 2018 14:19:04 +0800 Subject: [PATCH] HBASE-20500 [rsgroup] should keep at least one server in default group --- .../hadoop/hbase/rsgroup/RSGroupAdminServer.java | 6 +++++ .../hadoop/hbase/rsgroup/TestRSGroupsBase.java | 29 ++++++++++++++++++++++ 2 files changed, 35 insertions(+) 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 094fc1d..324ab24 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 @@ -309,6 +309,12 @@ public class RSGroupAdminServer implements RSGroupAdmin { if (RSGroupInfo.DEFAULT_GROUP.equals(srcGrp.getName())) { checkOnlineServersOnly(servers); } + + if (RSGroupInfo.DEFAULT_GROUP.equals(srcGrp.getName()) && srcGrp.getServers().size() <= + servers.size()) { + throw new ConstraintException("should keep at least one server in 'default' RSGroup."); + } + // Ensure all servers are of same rsgroup. for (Address server: servers) { String tmpGroup = rsGroupInfoManager.getRSGroupOfServer(server).getName(); 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 9e29637..392e5a7 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 @@ -340,6 +340,35 @@ 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); + LOG.warn(defaultGroup.getName() + " : " + defaultGroup.getServers()); + + //test remove all servers from default + try { + rsGroupAdmin.moveServers(defaultGroup.getServers(), fooGroup.getName()); + fail("should keep at least one server in 'default' RSGroup."); + } catch (ConstraintException ex) { + String exp = "should keep at least one server in 'default' RSGroup."; + assertTrue(ex.getMessage().contains(exp)); + } + + //test success case, remove one server from default ,keep at least one server + if (defaultGroup.getServers().size() > 1) { + Address serverInDefaultGroup = defaultGroup.getServers().iterator().next(); + Set
servers = new HashSet
(); + servers.add(serverInDefaultGroup); + rsGroupAdmin.moveServers(servers, fooGroup.getName()); + } + + } + + @Test public void testTableMoveTruncateAndDrop() throws Exception { final byte[] familyNameBytes = Bytes.toBytes("f"); String newGroupName = getGroupName(name.getMethodName()); -- 1.8.3.1