continue; proc = TransitRegionStateProcedure.reopen(env, regionNode.getRegionInfo()); regionNode.setProcedure(proc); } finally {
@Test public void testRecoveryAndDoubleExecutionReopen() throws Exception { MasterProcedureEnv env = UTIL.getMiniHBaseCluster().getMaster().getMasterProcedureExecutor().getEnvironment(); HRegionServer rs = UTIL.getRSForFirstRegionInTable(tableName); HRegion region = rs.getRegions(tableName).get(0); long openSeqNum = region.getOpenSeqNum(); TransitRegionStateProcedure proc = TransitRegionStateProcedure.reopen(env, region.getRegionInfo()); testRecoveryAndDoubleExcution(proc); // should still be on the same RS HRegion region2 = rs.getRegions(tableName).get(0); long openSeqNum2 = region2.getOpenSeqNum(); // confirm that the region is successfully opened assertTrue(openSeqNum2 > openSeqNum); }
@Test public void test() throws Exception { JVMClusterUtil.RegionServerThread rsThread = null; for (JVMClusterUtil.RegionServerThread t : UTIL.getMiniHBaseCluster() .getRegionServerThreads()) { if (!t.getRegionServer().getRegions(TABLE_NAME).isEmpty()) { rsThread = t; break; } } // find the rs and hri of the table HRegionServer rs = rsThread.getRegionServer(); RegionInfo hri = rs.getRegions(TABLE_NAME).get(0).getRegionInfo(); TransitRegionStateProcedure moveRegionProcedure = TransitRegionStateProcedure.reopen( UTIL.getMiniHBaseCluster().getMaster().getMasterProcedureExecutor().getEnvironment(), hri); RegionStateNode regionNode = UTIL.getMiniHBaseCluster().getMaster().getAssignmentManager() .getRegionStates().getOrCreateRegionStateNode(hri); regionNode.setProcedure(moveRegionProcedure); UTIL.getMiniHBaseCluster().getMaster().getMasterProcedureExecutor() .submitProcedure(moveRegionProcedure); countDownLatch.await(); UTIL.getMiniHBaseCluster().stopMaster(0); UTIL.getMiniHBaseCluster().startMaster(); // wait until master initialized UTIL.waitFor(30000, () -> UTIL.getMiniHBaseCluster().getMaster() != null && UTIL.getMiniHBaseCluster().getMaster().isInitialized()); Assert.assertTrue("Should be 3 RS after master restart", UTIL.getMiniHBaseCluster().getLiveRegionServerThreads().size() == 3); }
@Test public void testInfiniteLoop() throws IOException { HMaster master = UTIL.getMiniHBaseCluster().getMaster(); AssignmentManager am = master.getAssignmentManager(); ProcedureExecutor<MasterProcedureEnv> exec = master.getMasterProcedureExecutor(); RegionInfo regionInfo = UTIL.getAdmin().getRegions(TABLE_NAME).get(0); RegionStateNode regionNode = am.getRegionStates().getRegionStateNode(regionInfo); long procId; ReopenTableRegionsProcedure proc = new ReopenTableRegionsProcedure(TABLE_NAME); regionNode.lock(); try { procId = exec.submitProcedure(proc); UTIL.waitFor(30000, () -> proc.hasLock()); TransitRegionStateProcedure trsp = TransitRegionStateProcedure.reopen(exec.getEnvironment(), regionInfo); regionNode.setProcedure(trsp); exec.submitProcedure(trsp); } finally { regionNode.unlock(); } UTIL.waitFor(60000, () -> exec.isFinished(procId)); } }