/** * @return Maximum number of regions in transition */ private int getMaxRegionsInTransition() { int numRegions = this.assignmentManager.getRegionStates().getRegionAssignments().size(); return Math.max((int) Math.floor(numRegions * this.maxRitPercent), 1); }
@Override public void postMasterStartupInitialize() { if (services != null && regionFinder != null) { try { Set<RegionInfo> regions = services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet(); regionFinder.refreshAndWait(regions); } catch (Exception e) { LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e); } } }
private void splitMetaLogs(MasterProcedureEnv env) throws IOException { LOG.debug("Splitting meta WALs {}", this); MasterWalManager mwm = env.getMasterServices().getMasterWalManager(); AssignmentManager am = env.getMasterServices().getAssignmentManager(); am.getRegionStates().metaLogSplitting(serverName); mwm.splitMetaLog(serverName); am.getRegionStates().metaLogSplit(serverName); LOG.debug("Done splitting meta WALs {}", this); }
/** * Fetches all Regions for a table. Cache the result of this method if you need to use it multiple * times. Be aware that it may change over in between calls to this procedure. */ private List<RegionInfo> getRegionInfoList(final MasterProcedureEnv env) throws IOException { return env.getAssignmentManager().getRegionStates().getRegionsOfTable(getTableName()); } }
protected static void waitRegionInTransition(final MasterProcedureEnv env, final List<RegionInfo> regions) throws IOException { final RegionStates states = env.getAssignmentManager().getRegionStates(); for (final RegionInfo region : regions) { ProcedureSyncWait.waitFor(env, "regions " + region.getRegionNameAsString() + " in transition", new ProcedureSyncWait.Predicate<Boolean>() { @Override public Boolean evaluate() throws IOException { return !states.isRegionInTransition(region); } }); } }
private boolean incrementAndCheckMaxAttempts(MasterProcedureEnv env, RegionStateNode regionNode) { int retries = env.getAssignmentManager().getRegionStates().addToFailedOpen(regionNode) .incrementAndGetRetries(); int max = env.getAssignmentManager().getAssignMaxAttempts(); LOG.info("Retry={} of max={}; {}; {}", retries, max, this, regionNode.toShortString()); return retries >= max; }
/** * Set the region states to MERGING state */ private void setRegionStateToMerging(final MasterProcedureEnv env) { // Set State.MERGING to regions to be merged RegionStates regionStates = env.getAssignmentManager().getRegionStates(); regionStates.getRegionStateNode(regionsToMerge[0]).setState(State.MERGING); regionStates.getRegionStateNode(regionsToMerge[1]).setState(State.MERGING); }
protected void update(final AssignmentManager am) { final RegionStates regionStates = am.getRegionStates(); this.statTimestamp = EnvironmentEdgeManager.currentTime(); update(regionStates.getRegionsStateInTransition(), statTimestamp); update(regionStates.getRegionFailedOpen(), statTimestamp); }
private long getRegionSize(RegionInfo hri) { ServerName sn = masterServices.getAssignmentManager().getRegionStates(). getRegionServerOfRegion(hri); RegionMetrics regionLoad = masterServices.getServerManager().getLoad(sn). getRegionMetrics().get(hri.getRegionName()); if (regionLoad == null) { LOG.debug(hri.getRegionNameAsString() + " was not found in RegionsLoad"); return -1; } return (long) regionLoad.getStoreFileSize().get(Size.Unit.MEGABYTE); } }
private boolean canSchedule(MasterProcedureEnv env, HRegionLocation loc) { if (loc.getSeqNum() < 0) { return false; } RegionStateNode regionNode = env.getAssignmentManager().getRegionStates().getRegionStateNode(loc.getRegion()); // If the region node is null, then at least in the next round we can remove this region to make // progress. And the second condition is a normal one, if there are no TRSP with it then we can // schedule one to make progress. return regionNode == null || !regionNode.isInTransition(); }
@Test public void testGetRegionByStateOfTable() throws Exception { RegionInfo hri = createTableAndGetOneRegion(tableName); RegionStates regionStates = TEST_UTIL.getHBaseCluster().getMaster().getAssignmentManager().getRegionStates(); assertTrue(regionStates.getRegionByStateOfTable(tableName).get(RegionState.State.OPEN) .stream().anyMatch(r -> RegionInfo.COMPARATOR.compare(r, hri) == 0)); assertFalse(regionStates.getRegionByStateOfTable(TableName.valueOf("I_am_the_phantom")) .get(RegionState.State.OPEN).stream().anyMatch(r -> RegionInfo.COMPARATOR.compare(r, hri) == 0)); }
@Override public String explainFailure() throws IOException { final RegionStates regionStates = getMiniHBaseCluster().getMaster() .getAssignmentManager().getRegionStates(); return "found in transition: " + regionStates.getRegionsInTransition().toString(); }
private void init(MasterProcedureEnv env){ RegionStateNode regionNode = env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion()); regionNode.setProcedure(this); }
public static void waitForRegionToBeInTransition(final HBaseTestingUtility util, final RegionInfo hri) throws Exception { while (!getMaster(util).getAssignmentManager().getRegionStates().isRegionInTransition(hri)) { Threads.sleep(10); } }
@Test public void testBasicStartUp() throws IOException { RSGroupInfo defaultInfo = rsGroupAdmin.getRSGroupInfo(RSGroupInfo.DEFAULT_GROUP); assertEquals(4, defaultInfo.getServers().size()); // Assignment of root and meta regions. int count = master.getAssignmentManager().getRegionStates().getRegionAssignments().size(); // 2 meta, group assertEquals(2, count); }
@Test public void testCreateUnassignProcedureForSplitFail() throws IOException { RegionInfo region = getPrimaryRegions().get(0); AM.getRegionStates().getRegionStateNode(region) .setProcedure(TransitRegionStateProcedure.unassign(ENV, region)); try { AssignmentManagerUtil.createUnassignProceduresForSplitOrMerge(ENV, Stream.of(region), REGION_REPLICATION); fail("Should fail as the region is in transition"); } catch (HBaseIOException e) { // expected } }
@After public void tearDownAfterTest() throws IOException { for (RegionInfo region : UTIL.getAdmin().getRegions(TABLE_NAME)) { RegionStateNode regionNode = AM.getRegionStates().getRegionStateNode(region); // confirm that we have released the lock assertFalse(((ReentrantLock) regionNode.lock).isLocked()); TransitRegionStateProcedure proc = regionNode.getProcedure(); if (proc != null) { regionNode.unsetProcedure(proc); } } }
private List<RegionInfo> getRegionsThatCanBeMoved(TableName tableName, ServerName serverName) { List<RegionInfo> regions = Lists.newArrayList(); RegionStates rst = cluster.getMaster().getAssignmentManager().getRegionStates(); FavoredNodesManager fnm = cluster.getMaster().getFavoredNodesManager(); for (RegionInfo regionInfo : fnm.getRegionsOfFavoredNode(serverName)) { if (regionInfo.getTable().equals(tableName) && !ServerName.isSameAddress(rst.getRegionServerOfRegion(regionInfo), serverName)) { regions.add(regionInfo); } } return regions; }
@Override public Void call() throws Exception { AssignmentManager am = env.getAssignmentManager(); // try to simulate a master restart by removing the ServerManager states about seqIDs for (RegionState regionState: am.getRegionStates().getRegionStates()) { env.getMasterServices().getServerManager().removeRegion(regionState.getRegion()); } am.stop(); master.setInitialized(false); return null; } },
public static ServerName getServerHoldingRegion(final HBaseTestingUtility util, final RegionInfo hri) throws Exception { ServerName serverName = util.getMiniHBaseCluster().getServerHoldingRegion( hri.getTable(), hri.getRegionName()); ServerName amServerName = getMaster(util).getAssignmentManager().getRegionStates() .getRegionServerOfRegion(hri); // Make sure AM and MiniCluster agrees on the Server holding the region // and that the server is online. assertEquals(amServerName, serverName); assertEquals(true, getMaster(util).getServerManager().isServerOnline(serverName)); return serverName; }