From d03d791838e9193ead669cb68e2e338f9c1723f1 Mon Sep 17 00:00:00 2001 From: rahulgidwani Date: Tue, 13 Jan 2015 13:30:10 -0800 Subject: [PATCH] Balancer respects draining nodes with test fix --- .../apache/hadoop/hbase/master/RegionStates.java | 4 +++- .../hadoop/hbase/master/TestAssignmentManager.java | 28 ++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java index 393df49..68f3c18 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java @@ -752,13 +752,15 @@ public class RegionStates { Map onlineSvrs = serverManager.getOnlineServers(); - // Take care of servers w/o assignments. + // Take care of servers w/o assignments, and remove servers in draining mode + List drainingServers = this.serverManager.getDrainingServersList(); for (Map> map: result.values()) { for (ServerName svr: onlineSvrs.keySet()) { if (!map.containsKey(svr)) { map.put(svr, new ArrayList()); } } + map.keySet().removeAll(drainingServers); } return result; } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java index 604e121..fcd3bcb 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java @@ -24,10 +24,7 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.hadoop.hbase.CellScannable; @@ -105,6 +102,8 @@ public class TestAssignmentManager { ServerName.valueOf("example.org", 1234, 5678); private static final ServerName SERVERNAME_B = ServerName.valueOf("example.org", 0, 5678); + private static final ServerName SERVERNAME_C = + ServerName.valueOf("example.org", 0, 5678); private static final HRegionInfo REGIONINFO = new HRegionInfo(TableName.valueOf("t"), HConstants.EMPTY_START_ROW, HConstants.EMPTY_START_ROW); @@ -152,10 +151,12 @@ public class TestAssignmentManager { this.serverManager = Mockito.mock(ServerManager.class); Mockito.when(this.serverManager.isServerOnline(SERVERNAME_A)).thenReturn(true); Mockito.when(this.serverManager.isServerOnline(SERVERNAME_B)).thenReturn(true); + Mockito.when(this.serverManager.isServerOnline(SERVERNAME_C)).thenReturn(true); Mockito.when(this.serverManager.getDeadServers()).thenReturn(new DeadServer()); final Map onlineServers = new HashMap(); onlineServers.put(SERVERNAME_B, ServerLoad.EMPTY_SERVERLOAD); onlineServers.put(SERVERNAME_A, ServerLoad.EMPTY_SERVERLOAD); + onlineServers.put(SERVERNAME_C, ServerLoad.EMPTY_SERVERLOAD); Mockito.when(this.serverManager.getOnlineServersList()).thenReturn( new ArrayList(onlineServers.keySet())); Mockito.when(this.serverManager.getOnlineServers()).thenReturn(onlineServers); @@ -169,12 +170,18 @@ public class TestAssignmentManager { thenReturn(true); Mockito.when(this.serverManager.sendRegionClose(SERVERNAME_B, REGIONINFO, -1)). thenReturn(true); + Mockito.when(this.serverManager.sendRegionClose(SERVERNAME_C, REGIONINFO, -1)). + thenReturn(true); // Ditto on open. Mockito.when(this.serverManager.sendRegionOpen(SERVERNAME_A, REGIONINFO, -1, null)). thenReturn(RegionOpeningState.OPENED); Mockito.when(this.serverManager.sendRegionOpen(SERVERNAME_B, REGIONINFO, -1, null)). thenReturn(RegionOpeningState.OPENED); + Mockito.when(this.serverManager.sendRegionOpen(SERVERNAME_C, REGIONINFO, -1, null)). + thenReturn(RegionOpeningState.OPENED); this.master = Mockito.mock(HMaster.class); + Mockito.when(this.serverManager.getDrainingServersList()) + .thenReturn(Arrays.asList(SERVERNAME_C)); Mockito.when(this.master.getServerManager()).thenReturn(serverManager); } @@ -245,6 +252,19 @@ public class TestAssignmentManager { } @Test(timeout = 60000) + public void testGettingAssignmentsExcludesDrainingServers() throws Exception { + AssignmentManagerWithExtrasForTesting am = + setUpMockedAssignmentManager(this.server, this.serverManager); + + Map>> + result = am.getRegionStates().getAssignmentsByTable(); + for (Map> map : result.values()) { + System.out.println(map.keySet()); + assertFalse(map.containsKey(SERVERNAME_C)); + } + } + + @Test(timeout = 60000) public void testBalanceOnMasterFailoverScenarioWithClosedNode() throws IOException, KeeperException, InterruptedException, ServiceException, DeserializationException { AssignmentManagerWithExtrasForTesting am = -- 2.1.0