You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2018/05/08 14:59:07 UTC

hbase git commit: HBASE-20500 [rsgroup] should keep at least one server in default group

Repository: hbase
Updated Branches:
  refs/heads/master 1825af45b -> 102f0bf9c


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

Signed-off-by: tedyu <yu...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/102f0bf9
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/102f0bf9
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/102f0bf9

Branch: refs/heads/master
Commit: 102f0bf9c565f70afd272cd5f2cb39305c3783f8
Parents: 1825af4
Author: Yechao Chen <ch...@gmail.com>
Authored: Tue May 8 14:04:59 2018 +0800
Committer: tedyu <yu...@gmail.com>
Committed: Tue May 8 07:59:01 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/102f0bf9/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 094fc1d..670e8aa 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/102f0bf9/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 9e29637..199dd98 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,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());