HBASE-20500 [rsgroup] should keep at least one server in default group

Signed-off-by: tedyu <yuzhihong@gmail.com>
This commit is contained in:
Yechao Chen 2018-05-08 14:04:59 +08:00 committed by tedyu
parent 1825af45b3
commit 102f0bf9c5
2 changed files with 52 additions and 0 deletions

View File

@ -56,6 +56,8 @@ import org.apache.hbase.thirdparty.com.google.common.collect.Maps;
@InterfaceAudience.Private @InterfaceAudience.Private
public class RSGroupAdminServer implements RSGroupAdmin { public class RSGroupAdminServer implements RSGroupAdmin {
private static final Logger LOG = LoggerFactory.getLogger(RSGroupAdminServer.class); 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 MasterServices master;
private final RSGroupInfoManager rsGroupInfoManager; 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 // Only move online servers (when moving from 'default') or servers from other
// groups. This prevents bogus servers from entering groups // groups. This prevents bogus servers from entering groups
if (RSGroupInfo.DEFAULT_GROUP.equals(srcGrp.getName())) { 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); checkOnlineServersOnly(servers);
} }
// Ensure all servers are of same rsgroup. // Ensure all servers are of same rsgroup.

View File

@ -339,6 +339,53 @@ public abstract class TestRSGroupsBase {
Assert.assertEquals(null, rsGroupAdmin.getRSGroupInfo(fooGroup.getName())); Assert.assertEquals(null, rsGroupAdmin.getRSGroupInfo(fooGroup.getName()));
} }
@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 @Test
public void testTableMoveTruncateAndDrop() throws Exception { public void testTableMoveTruncateAndDrop() throws Exception {
final byte[] familyNameBytes = Bytes.toBytes("f"); final byte[] familyNameBytes = Bytes.toBytes("f");