From f5080eb9a604b6d22fdd4d48037aa66f0a824e85 Mon Sep 17 00:00:00 2001 From: Mohammad Arshad Date: Wed, 15 Jul 2020 18:27:15 +0530 Subject: [PATCH] HBASE-24721: rename_rsgroup overwriting the existing rsgroup Closes #2066 Co-authored-by: Viraj Jasani Signed-off-by: Reid Chan Signed-off-by: Viraj Jasani --- .../hbase/rsgroup/RSGroupInfoManagerImpl.java | 3 ++ .../hbase/rsgroup/TestRSGroupsAdmin1.java | 42 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.java index 008484d2cbf..fa044309694 100644 --- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.java +++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.java @@ -850,6 +850,9 @@ public class RSGroupInfoManagerImpl implements RSGroupInfoManager, ServerListene if (oldName.equals(RSGroupInfo.DEFAULT_GROUP)) { throw new ConstraintException("Can't rename default rsgroup"); } + if (rsGroupMap.containsKey(newName)) { + throw new ConstraintException("Group already exists: " + newName); + } RSGroupInfo oldGroup = getRSGroup(oldName); Map newGroupMap = Maps.newHashMap(rsGroupMap); diff --git a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java index b95db7b23a6..9cb09dc3676 100644 --- a/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java +++ b/hbase-rsgroup/src/test/java/org/apache/hadoop/hbase/rsgroup/TestRSGroupsAdmin1.java @@ -21,6 +21,7 @@ package org.apache.hadoop.hbase.rsgroup; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -519,4 +520,45 @@ public class TestRSGroupsAdmin1 extends TestRSGroupsBase { assertTrue(newgroup.containsTable(tb1)); assertEquals(normal.getName(), rsGroupAdmin.getRSGroupInfoOfTable(tb2).getName()); } + + @Test + public void testRenameRSGroupConstraints() throws Exception { + // Add RSGroup, and assign 2 servers and a table to it. + String oldGroupName = "oldGroup"; + RSGroupInfo oldGroup = addGroup(rsGroupAdmin, oldGroupName, 2); + oldGroup = rsGroupAdmin.getRSGroupInfo(oldGroup.getName()); + assertNotNull(oldGroup); + assertEquals(2, oldGroup.getServers().size()); + + //Add another RSGroup + String anotherRSGroupName = "anotherRSGroup"; + RSGroupInfo anotherGroup = addGroup(rsGroupAdmin, anotherRSGroupName, 1); + anotherGroup = rsGroupAdmin.getRSGroupInfo(anotherGroup.getName()); + assertNotNull(anotherGroup); + assertEquals(1, anotherGroup.getServers().size()); + + //Rename to existing group + try { + rsGroupAdmin.renameRSGroup(oldGroup.getName(), anotherRSGroupName); + fail("ConstraintException was expected."); + } catch (ConstraintException e) { + assertTrue(e.getMessage().contains("Group already exists")); + } + + //Rename default RSGroup + try { + rsGroupAdmin.renameRSGroup(RSGroupInfo.DEFAULT_GROUP, "newRSGroup2"); + fail("ConstraintException was expected."); + } catch (ConstraintException e) { + //Do nothing + } + + //Rename to default RSGroup + try { + rsGroupAdmin.renameRSGroup(oldGroup.getName(), RSGroupInfo.DEFAULT_GROUP); + fail("ConstraintException was expected."); + } catch (ConstraintException e) { + assertTrue(e.getMessage().contains("Group already exists")); + } + } }