Skip to content

Instantly share code, notes, and snippets.

@gustavoanatoly
Created April 1, 2013 01:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gustavoanatoly/5282776 to your computer and use it in GitHub Desktop.
Save gustavoanatoly/5282776 to your computer and use it in GitHub Desktop.
Unit Test, to verify if AM doesn't use a drained server
/**
* This is an unit test, to verify if Assignment Manager
* doesn't use a drained server, comparing number of online region
* on initial state of the cluster is equal after to put a server
* into a drained list.
*
* @throws ServiceException
* @throws InterruptedException
* @throws IOException
* @throws KeeperException
*/
@Test
public void testAssignmentManagerDoesntUseDrainingServer() throws ServiceException, InterruptedException, IOException, KeeperException {
HMaster hMaster = TEST_UTIL.getMiniHBaseCluster().getMaster();
Collection<ServerName> servers = TEST_UTIL.getMiniHBaseCluster().getInitialClusterStatus().getServers();
Long sizeServedRegions = TEST_UTIL.getMiniHBaseCluster().countServedRegions();
LOG.info("Regions served: " + sizeServedRegions);
AssignmentManager am = hMaster.getAssignmentManager();
int sizeRegionAssignments = am.getRegionStates().getRegionAssignments().size();
LOG.info("Size Assigned Regions: " + sizeRegionAssignments);
int randomIndexServer = new Random().nextInt(servers.size());
ServerName drainedServer = (ServerName) servers.toArray()[randomIndexServer];
LOG.info("Putting Server on Drained List: " + hMaster.getServerManager().addServerToDrainList(drainedServer));
HRegionInfo hri = new HRegionInfo(Bytes.toBytes("table"),
HConstants.EMPTY_START_ROW, HConstants.EMPTY_START_ROW, true);
LOG.info("Avaible Servers: " + hMaster.getServerManager().createDestinationServersList().size());
Map<HRegionInfo, ServerName> bulkRegion = new HashMap<HRegionInfo, ServerName>();
bulkRegion.put(hri, drainedServer);
am.assign(bulkRegion);
am.getRegionStates().waitForAssignment(hri);
LOG.info("Creating plan to Drained Server: " + drainedServer.toString());
RegionPlan planToDrainedServer = new RegionPlan(hri, null, drainedServer);
am.addPlan(hri.getEncodedName(), planToDrainedServer);
am.assign(hri, true);
am.getRegionStates().waitForAssignment(hri);
LOG.info("Creating plan to migrate region online to drained server.");
Map<HRegionInfo, ServerName> regionAssignments = am.getRegionStates().getRegionAssignments();
int indexAssignedRegionServer = new Random().nextInt(regionAssignments.size());
HRegionInfo hriAssigned = (HRegionInfo) regionAssignments.keySet().toArray()[indexAssignedRegionServer];
ServerName serverHriAssigned = regionAssignments.get(hriAssigned);
RegionPlan planFromOnlineToDrainedServer = new RegionPlan(hriAssigned, serverHriAssigned, drainedServer);
am.addPlan(hriAssigned.getEncodedName(), planFromOnlineToDrainedServer);
am.assign(hriAssigned, true);
am.waitForAssignment(hriAssigned);
ServerName drainedRegionServer = am.getRegionStates().getRegionServerOfRegion(hri);
List<ServerName> destServerList = hMaster.getServerManager().createDestinationServersList();
LOG.info("Server is not in destination Server List");
assertFalse(destServerList.contains(drainedRegionServer));
int finalSizeRegionAssignment = am.getRegionStates().getRegionAssignments().size();
assertEquals(sizeRegionAssignments, finalSizeRegionAssignment);
LOG.info("Initial size assigned regions: " + sizeRegionAssignments);
LOG.info("Final size assigned regions: " + finalSizeRegionAssignment);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment