public boolean isRegionInTransition(final RegionInfo regionInfo) { final RegionStateNode node = regionInTransition.get(regionInfo); return node != null ? node.isInTransition() : false; }
public List<RegionInfo> getAssignedRegions() { final List<RegionInfo> result = new ArrayList<RegionInfo>(); for (RegionStateNode node: regionsMap.values()) { if (!node.isInTransition()) { result.add(node.getRegionInfo()); } } return result; }
public RegionState getRegionTransitionState(RegionInfo hri) { RegionStateNode node = regionInTransition.get(hri); if (node == null) { return null; } node.lock(); try { return node.isInTransition() ? node.toRegionState() : null; } finally { node.unlock(); } }
try { if (ignoreIfInTransition) { if (regionNode.isInTransition()) { return null; assert !regionNode.isInTransition();
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 testCreateUnassignProceduresForMergeFail() throws IOException { List<RegionInfo> regions = getPrimaryRegions(); RegionInfo regionA = regions.get(0); RegionInfo regionB = regions.get(1); AM.getRegionStates().getRegionStateNode(regionB) .setProcedure(TransitRegionStateProcedure.unassign(ENV, regionB)); try { AssignmentManagerUtil.createUnassignProceduresForSplitOrMerge(ENV, Stream.of(regionA, regionB), REGION_REPLICATION); fail("Should fail as the region is in transition"); } catch (HBaseIOException e) { // expected } IntStream.range(0, REGION_REPLICATION) .mapToObj(i -> RegionReplicaUtil.getRegionInfoForReplica(regionA, i)) .map(AM.getRegionStates()::getRegionStateNode).forEachOrdered( rn -> assertFalse("Should have unset the proc for " + rn, rn.isInTransition())); } }
private void testRecoveryAndDoubleExcution(TransitRegionStateProcedure proc) throws Exception { HMaster master = UTIL.getHBaseCluster().getMaster(); AssignmentManager am = master.getAssignmentManager(); RegionStateNode regionNode = am.getRegionStates().getRegionStateNode(proc.getRegion()); assertFalse(regionNode.isInTransition()); regionNode.setProcedure(proc); assertTrue(regionNode.isInTransition()); ProcedureExecutor<MasterProcedureEnv> procExec = master.getMasterProcedureExecutor(); ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, true); long procId = procExec.submitProcedure(proc); MasterProcedureTestingUtility.testRecoveryAndDoubleExecution(procExec, procId); regionNode = am.getRegionStates().getRegionStateNode(proc.getRegion()); assertFalse(regionNode.isInTransition()); }
protected TransitRegionStateProcedure createUnassignProcedure(RegionInfo hri) { RegionStateNode regionNode = am.getRegionStates().getRegionStateNode(hri); TransitRegionStateProcedure proc; regionNode.lock(); try { assertFalse(regionNode.isInTransition()); proc = TransitRegionStateProcedure .unassign(master.getMasterProcedureExecutor().getEnvironment(), hri); regionNode.setProcedure(proc); } finally { regionNode.unlock(); } return proc; }
@Test public void testAssignRegionAndUnassignRegion() throws Exception { createTableWithDefaultConf(tableName); // assign region. HMaster master = TEST_UTIL.getHBaseCluster().getMaster(); AssignmentManager am = master.getAssignmentManager(); RegionInfo hri = am.getRegionStates().getRegionsOfTable(tableName).get(0); // assert region on server RegionStates regionStates = am.getRegionStates(); ServerName serverName = regionStates.getRegionServerOfRegion(hri); TEST_UTIL.assertRegionOnServer(hri, serverName, 200); assertTrue(regionStates.getRegionState(hri).isOpened()); // Region is assigned now. Let's assign it again. // Master should not abort, and region should stay assigned. try { admin.assign(hri.getRegionName()).get(); fail("Should fail when assigning an already onlined region"); } catch (ExecutionException e) { // Expected assertThat(e.getCause(), instanceOf(DoNotRetryRegionException.class)); } assertFalse(am.getRegionStates().getRegionStateNode(hri).isInTransition()); assertTrue(regionStates.getRegionState(hri).isOpened()); // unassign region admin.unassign(hri.getRegionName(), true).get(); assertFalse(am.getRegionStates().getRegionStateNode(hri).isInTransition()); assertTrue(regionStates.getRegionState(hri).isClosed()); }
public static boolean waitForAssignment(AssignmentManager am, RegionInfo regionInfo) throws IOException { // This method can be called before the regionInfo has made it into the regionStateMap // so wait around here a while. Waiter.waitFor(am.getConfiguration(), 10000, () -> am.getRegionStates().getRegionStateNode(regionInfo) != null); RegionStateNode regionNode = am.getRegionStates().getRegionStateNode(regionInfo); // Wait until the region has already been open, or we have a TRSP along with it. Waiter.waitFor(am.getConfiguration(), 30000, () -> regionNode.isInState(State.OPEN) || regionNode.isInTransition()); TransitRegionStateProcedure proc = regionNode.getProcedure(); regionNode.lock(); try { if (regionNode.isInState(State.OPEN)) { return true; } proc = regionNode.getProcedure(); } finally { regionNode.unlock(); } assertNotNull(proc); ProcedureSyncWait.waitForProcedureToCompleteIOE(am.getMaster().getMasterProcedureExecutor(), proc, 5L * 60 * 1000); return true; } }