From 6ae436d160ccba021826d2b6b358ba604b51d8b4 Mon Sep 17 00:00:00 2001 From: haxiaolin Date: Mon, 12 Feb 2018 16:48:02 +0800 Subject: [PATCH] HBASE-19974 Decommissioned servers cannot be removed by remove_servers_rsgroup mehods --- .../hadoop/hbase/rsgroup/RSGroupAdminServer.java | 8 +++-- .../hadoop/hbase/rsgroup/TestRSGroupsBase.java | 39 +++++++++++++--------- 2 files changed, 30 insertions(+), 17 deletions(-) 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 57d5412..4fa0097 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 @@ -675,8 +675,12 @@ public class RSGroupAdminServer implements RSGroupAdmin { private void checkForDeadOrOnlineServers(Set
servers) throws ConstraintException { // This uglyness is because we only have Address, not ServerName. Set
onlineServers = new HashSet<>(); - for(ServerName server: master.getServerManager().getOnlineServers().keySet()) { - onlineServers.add(server.getAddress()); + List drainingServers = master.getServerManager().getDrainingServersList(); + for (ServerName server : master.getServerManager().getOnlineServers().keySet()) { + // Only online but not decommissioned servers is real online + if (!drainingServers.contains(server)) { + onlineServers.add(server.getAddress()); + } } Set
deadServers = new HashSet<>(); 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 cae9da3..2995a08 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 @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hbase.rsgroup; +import static org.apache.hadoop.hbase.util.Threads.sleep; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; @@ -25,8 +26,10 @@ import static org.junit.Assert.fail; import java.io.IOException; import java.security.SecureRandom; +import java.util.ArrayList; import java.util.EnumSet; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -906,6 +909,8 @@ public abstract class TestRSGroupsBase { && cluster.getClusterMetrics().getDeadServerNames().size() > 0; } }); + // wait for metrics updated + sleep(1000); assertFalse(cluster.getClusterMetrics().getLiveServerMetrics().containsKey(targetServer)); assertTrue(cluster.getClusterMetrics().getDeadServerNames().contains(targetServer)); assertTrue(newGroup.getServers().contains(targetServer.getAddress())); @@ -923,8 +928,9 @@ public abstract class TestRSGroupsBase { public void testRemoveServers() throws Exception { LOG.info("testRemoveServers"); final RSGroupInfo newGroup = addGroup(getGroupName(name.getMethodName()), 3); - ServerName targetServer = ServerName.parseServerName( - newGroup.getServers().iterator().next().toString()); + Iterator
iterator = newGroup.getServers().iterator(); + + ServerName targetServer = ServerName.parseServerName(iterator.next().toString()); try { rsGroupAdmin.removeServers(Sets.newHashSet(targetServer.getAddress())); fail("Online servers shouldn't have been successfully removed."); @@ -943,6 +949,7 @@ public abstract class TestRSGroupsBase { GetServerInfoRequest.newBuilder().build()).getServerInfo().getServerName()); //stopping may cause an exception //due to the connection loss + LOG.info("stopping server " + targetServer.getHostAndPort()); targetRS.stopServer(null, AdminProtos.StopServerRequest.newBuilder().setReason("Die").build()); } catch(Exception e) { @@ -968,21 +975,23 @@ public abstract class TestRSGroupsBase { assertTrue(msg + " " + ex.getMessage(), ex.getMessage().contains(exp)); } assertTrue(newGroup.getServers().contains(targetServer.getAddress())); + List toDecommissionServers = new ArrayList<>(); + Address address = iterator.next(); + Set onlineServers = TEST_UTIL.getMiniHBaseCluster().getMaster() + .getServerManager().getOnlineServers().keySet(); + for(ServerName sn : onlineServers){ + if(sn.getAddress().equals(address)){ + toDecommissionServers.add(sn); + } + } + assertTrue(!toDecommissionServers.isEmpty()); + admin.decommissionRegionServers(toDecommissionServers, true); + assertEquals(1, admin.listDecommissionedRegionServers().size()); - ServerName sn = TEST_UTIL.getHBaseClusterInterface().getClusterMetrics().getMasterName(); - TEST_UTIL.getHBaseClusterInterface().stopMaster(sn); - TEST_UTIL.getHBaseClusterInterface().waitForMasterToStop(sn, 60000); - TEST_UTIL.getHBaseClusterInterface().startMaster(sn.getHostname(), 0); - TEST_UTIL.getHBaseClusterInterface().waitForActiveAndReadyMaster(60000); - - assertEquals(3, cluster.getClusterMetrics().getLiveServerMetrics().size()); - assertFalse(cluster.getClusterMetrics().getLiveServerMetrics().containsKey(targetServer)); - assertFalse(cluster.getClusterMetrics().getDeadServerNames().contains(targetServer)); - assertTrue(newGroup.getServers().contains(targetServer.getAddress())); - - rsGroupAdmin.removeServers(Sets.newHashSet(targetServer.getAddress())); + assertTrue(newGroup.getServers().contains(address)); + rsGroupAdmin.removeServers(Sets.newHashSet(address)); Set
newGroupServers = rsGroupAdmin.getRSGroupInfo(newGroup.getName()).getServers(); - assertFalse(newGroupServers.contains(targetServer.getAddress())); + assertFalse(newGroupServers.contains(address)); assertEquals(2, newGroupServers.size()); } } -- 1.9.1