@Override protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException { final AssignRegionStateData.Builder state = AssignRegionStateData.newBuilder().setTransitionState(getTransitionState()) .setRegionInfo(ProtobufUtil.toRegionInfo(getRegionInfo())); if (forceNewPlan) { state.setForceNewPlan(true); } if (this.targetServer != null) { state.setTargetServer(ProtobufUtil.toServerName(this.targetServer)); } if (getAttempt() > 0) { state.setAttempt(getAttempt()); } serializer.serialize(state.build()); }
@Override protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException { final AssignRegionStateData state = serializer.deserialize(AssignRegionStateData.class); setTransitionState(state.getTransitionState()); setRegionInfo(ProtobufUtil.toRegionInfo(state.getRegionInfo())); forceNewPlan = state.getForceNewPlan(); if (state.hasTargetServer()) { this.targetServer = ProtobufUtil.toServerName(state.getTargetServer()); } if (state.hasAttempt()) { setAttempt(state.getAttempt()); } }
@Override public RemoteOperation remoteCallBuild(final MasterProcedureEnv env, final ServerName serverName) { assert serverName.equals(getRegionState(env).getRegionLocation()); return new RegionOpenOperation(this, getRegionInfo(), env.getAssignmentManager().getFavoredNodes(getRegionInfo()), false); }
@Test public void testSimpleComparator() { List<AssignProcedure> procedures = new ArrayList<AssignProcedure>(); RegionInfo user1 = RegionInfoBuilder.newBuilder(TableName.valueOf("user_space1")).build(); procedures.add(new AssignProcedure(user1)); RegionInfo user2 = RegionInfoBuilder.newBuilder(TableName.valueOf("user_space2")).build(); procedures.add(new AssignProcedure(RegionInfoBuilder.FIRST_META_REGIONINFO)); procedures.add(new AssignProcedure(user2)); RegionInfo system = RegionInfoBuilder.newBuilder(TableName.NAMESPACE_TABLE_NAME).build(); procedures.add(new AssignProcedure(system)); procedures.sort(AssignProcedure.COMPARATOR); assertTrue(procedures.get(0).isMeta()); assertTrue(procedures.get(1).getRegionInfo().getTable().equals(TableName.NAMESPACE_TABLE_NAME)); }
List<AssignProcedure> procedures = new ArrayList<AssignProcedure>(); RegionInfo user3 = RegionInfoBuilder.newBuilder(TableName.valueOf("user3")).build(); procedures.add(new AssignProcedure(user3)); RegionInfo system = RegionInfoBuilder.newBuilder(TableName.NAMESPACE_TABLE_NAME).build(); procedures.add(new AssignProcedure(system)); RegionInfo user1 = RegionInfoBuilder.newBuilder(TableName.valueOf("user_space1")).build(); RegionInfo user2 = RegionInfoBuilder.newBuilder(TableName.valueOf("user_space2")).build(); procedures.add(new AssignProcedure(user1)); RegionInfo meta2 = RegionInfoBuilder.newBuilder(TableName.META_TABLE_NAME). setStartKey(Bytes.toBytes("002")).build(); procedures.add(new AssignProcedure(meta2)); procedures.add(new AssignProcedure(user2)); RegionInfo meta1 = RegionInfoBuilder.newBuilder(TableName.META_TABLE_NAME). setStartKey(Bytes.toBytes("001")).build(); procedures.add(new AssignProcedure(meta1)); procedures.add(new AssignProcedure(RegionInfoBuilder.FIRST_META_REGIONINFO)); RegionInfo meta0 = RegionInfoBuilder.newBuilder(TableName.META_TABLE_NAME). setStartKey(Bytes.toBytes("000")).build(); procedures.add(new AssignProcedure(meta0)); for (int i = 0; i < 10; i++) { Collections.shuffle(procedures); procedures.sort(AssignProcedure.COMPARATOR); try { assertTrue(procedures.get(0).getRegionInfo().equals(RegionInfoBuilder.FIRST_META_REGIONINFO)); assertTrue(procedures.get(1).getRegionInfo().equals(meta0)); assertTrue(procedures.get(2).getRegionInfo().equals(meta1)); assertTrue(procedures.get(3).getRegionInfo().equals(meta2)); assertTrue(procedures.get(4).getRegionInfo().getTable().equals(TableName.NAMESPACE_TABLE_NAME)); assertTrue(procedures.get(5).getRegionInfo().equals(user1));
() -> executor.getProcedures().stream().filter(p -> p instanceof AssignProcedure) .map(p -> (AssignProcedure) p) .anyMatch(p -> Bytes.equals(hri.getRegionName(), p.getRegionInfo().getRegionName()))); proc.resume(); UTIL.waitFor(30000, () -> executor.isFinished(procId));
@Override void setTransitionState(MasterProcedureProtos.RegionTransitionState state) { if (state == MasterProcedureProtos.RegionTransitionState.REGION_TRANSITION_DISPATCH) { try { LOG.info("LATCH2 {}", this.latch.getCount()); this.latch.await(); LOG.info("LATCH3 {}", this.latch.getCount()); } catch (InterruptedException e) { e.printStackTrace(); } } else if (state == MasterProcedureProtos.RegionTransitionState.REGION_TRANSITION_QUEUE) { // Set latch. LOG.info("LATCH1 {}", this.latch.getCount()); this.latch.countDown(); } super.setTransitionState(state); } }
private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception { rsDispatcher.setMockRsExecutor(executor); AssignProcedure[] assignments = new AssignProcedure[nregions]; long st = System.currentTimeMillis(); bulkSubmit(assignments); for (int i = 0; i < assignments.length; ++i) { ProcedureTestingUtility.waitProcedure( master.getMasterProcedureExecutor(), assignments[i]); assertTrue(assignments[i].toString(), assignments[i].isSuccess()); } long et = System.currentTimeMillis(); float sec = ((et - st) / 1000.0f); LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)", assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec)); }
@Override protected boolean addToRemoteDispatcher(MasterProcedureEnv env, ServerName targetServer) { // So, mock the ServerCrashProcedure nulling out the targetServer AFTER updateTransition // has been called and BEFORE updateTransition gets to here. // We used to throw a NullPointerException. Now we just say the assign failed so it will // be rescheduled. boolean b = super.addToRemoteDispatcher(env, null); assertFalse(b); // Assert we were actually called. this.addToRemoteDispatcherWasCalled.set(true); return b; }
() -> executor.getProcedures().stream().filter(p -> p instanceof AssignProcedure) .map(p -> (AssignProcedure) p) .anyMatch(p -> Bytes.equals(hri.getRegionName(), p.getRegionInfo().getRegionName()))); proc.resume(); UTIL.waitFor(30000, () -> executor.isFinished(procId));