@Override protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException { super.deserializeStateData(serializer); final MoveRegionStateData state = serializer.deserialize(MoveRegionStateData.class); final RegionInfo regionInfo = getRegion(); // Get it from super class deserialization. final ServerName sourceServer = ProtobufUtil.toServerName(state.getSourceServer()); final ServerName destinationServer = state.hasDestinationServer() ? ProtobufUtil.toServerName(state.getDestinationServer()) : null; this.plan = new RegionPlan(regionInfo, sourceServer, destinationServer); } }
@Override protected Flow executeFromState(MasterProcedureEnv env, MasterProcedureProtos.MoveRegionState state) throws InterruptedException { Flow flow = null; switch (state) { case MOVE_REGION_UNASSIGN: // Just before the unassign, flip the state to SPLIT. The unassign should exit! RegionStates.RegionStateNode rsn = env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(getRegion()); rsn.setState(RegionState.State.SPLIT); LOG.info("HACKED RSN, setting it to SPLIT: {}", rsn); split.set(true); default: flow = super.executeFromState(env, state); } return flow; } }
@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(); MoveRegionProcedure moveRegionProcedure = new MoveRegionProcedure( UTIL.getMiniHBaseCluster().getMaster().getMasterProcedureExecutor() .getEnvironment(), new RegionPlan(hri, rs.getServerName(), rs.getServerName()), true); long procID = 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); }