From ca4fedfe734a6d3ffb93500e331bf29ed154c09f Mon Sep 17 00:00:00 2001 From: Yechao Chen Date: Sun, 29 Apr 2018 00:28:24 +0800 Subject: [PATCH] HBASE-20500 [rsgroup] should keep at least one server in default group --- .../hadoop/hbase/rsgroup/RSGroupAdminServer.java | 3 ++ .../hadoop/hbase/rsgroup/TestRSGroupsBase.java | 32 ++++++++++++++++++++++ 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..1f2b356 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 @@ -307,6 +307,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("should keep at least one server in 'default' RSGroup."); + } checkOnlineServersOnly(servers); } // Ensure all servers are of same rsgroup. 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..544e0d8 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,38 @@ 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("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(); + LOG.info("moving server " + serverInDefaultGroup + " from group default to group " + + fooGroup.getName()); + rsGroupAdmin.moveServers(Sets.newHashSet(serverInDefaultGroup), fooGroup.getName()); + } + + //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()); -- 1.8.3.1