HBASE-18272 Fix issue about RSGroupBasedLoadBalancer#roundRobinAssignment where BOGUS_SERVER_NAME is involved in two groups (chenxu)

This commit is contained in:
tedyu 2017-06-27 07:03:10 -07:00
parent 873b15ee31
commit 0f4ea611e1
2 changed files with 41 additions and 1 deletions

View File

@ -167,7 +167,13 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer {
regionMap.get(groupKey), regionMap.get(groupKey),
serverMap.get(groupKey)); serverMap.get(groupKey));
if(result != null) { if(result != null) {
assignments.putAll(result); if(result.containsKey(LoadBalancer.BOGUS_SERVER_NAME) &&
assignments.containsKey(LoadBalancer.BOGUS_SERVER_NAME)){
assignments.get(LoadBalancer.BOGUS_SERVER_NAME).addAll(
result.get(LoadBalancer.BOGUS_SERVER_NAME));
} else {
assignments.putAll(result);
}
} }
} }
} }

View File

@ -34,6 +34,7 @@ import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
import org.apache.hadoop.hbase.rsgroup.RSGroupInfoManager; import org.apache.hadoop.hbase.rsgroup.RSGroupInfoManager;
import org.apache.hadoop.hbase.master.assignment.AssignmentManager; import org.apache.hadoop.hbase.master.assignment.AssignmentManager;
import org.apache.hadoop.hbase.master.HMaster; import org.apache.hadoop.hbase.master.HMaster;
import org.apache.hadoop.hbase.master.LoadBalancer;
import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.master.MasterServices;
import org.apache.hadoop.hbase.master.RegionPlan; import org.apache.hadoop.hbase.master.RegionPlan;
import org.apache.hadoop.hbase.net.Address; import org.apache.hadoop.hbase.net.Address;
@ -52,6 +53,8 @@ import java.security.SecureRandom;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -244,6 +247,37 @@ public class TestRSGroupBasedLoadBalancer {
assertRetainedAssignment(inputForTest, servers, newAssignment); assertRetainedAssignment(inputForTest, servers, newAssignment);
} }
/**
* Test BOGUS_SERVER_NAME among groups do not overwrite each other
* @throws Exception
*/
@Test
public void testRoundRobinAssignment() throws Exception {
List<ServerName> onlineServers = new ArrayList<ServerName>(servers.size());
onlineServers.addAll(servers);
List<HRegionInfo> regions = randomRegions(25);
int bogusRegion = 0;
for(HRegionInfo region : regions){
String group = tableMap.get(region.getTable());
if("dg3".equals(group) || "dg4".equals(group)){
bogusRegion++;
}
}
Set<Address> offlineServers = new HashSet<Address>();
offlineServers.addAll(groupMap.get("dg3").getServers());
offlineServers.addAll(groupMap.get("dg4").getServers());
for(Iterator<ServerName> it = onlineServers.iterator(); it.hasNext();){
ServerName server = it.next();
Address address = server.getAddress();
if(offlineServers.contains(address)){
it.remove();
}
}
Map<ServerName, List<HRegionInfo>> assignments = loadBalancer
.roundRobinAssignment(regions, onlineServers);
assertEquals(bogusRegion, assignments.get(LoadBalancer.BOGUS_SERVER_NAME).size());
}
/** /**
* Asserts a valid retained assignment plan. * Asserts a valid retained assignment plan.
* <p> * <p>