/** * Create one TransitRegionStateProcedure to unassign a region. * This method is specified for HBCK2 */ public TransitRegionStateProcedure createOneUnassignProcedure(RegionInfo hri, boolean override) { RegionStateNode regionNode = regionStates.getOrCreateRegionStateNode(hri); return createUnassignProcedure(regionNode, override); }
@Test public void testUnassignAndCrashBeforeResponse() throws Exception { final TableName tableName = TableName.valueOf("testAssignAndCrashBeforeResponse"); final RegionInfo hri = createRegionInfo(tableName, 1); rsDispatcher.setMockRsExecutor(new HangOnCloseThenRSCrashExecutor()); for (int i = 0; i < HangOnCloseThenRSCrashExecutor.TYPES_OF_FAILURE; i++) { AssignProcedure assign = am.createAssignProcedure(hri); waitOnFuture(submitProcedure(assign)); UnassignProcedure unassign = am.createUnassignProcedure(hri, am.getRegionStates().getRegionServerOfRegion(hri), false); waitOnFuture(submitProcedure(unassign)); } }
@Test public void testUnassignAnUnassignedRegion() throws Exception { final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion"); final RegionInfo hri = createRegionInfo(tableName, 1); // collect AM metrics before test collectAssignmentManagerMetrics(); rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); // assign the region first waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); final Future<byte[]> futureA = submitProcedure(am.createUnassignProcedure(hri, null, false)); // Wait first unassign. waitOnFuture(futureA); am.getRegionStates().isRegionInState(hri, State.CLOSED); // Second should be a noop. We should recognize region is already CLOSED internally // and skip out doing nothing. final Future<byte[]> futureB = submitProcedure(am.createUnassignProcedure(hri, ServerName.valueOf("example.org,1234,1"), false)); waitOnFuture(futureB); // Ensure we are still CLOSED. am.getRegionStates().isRegionInState(hri, State.CLOSED); // TODO: What else can we do to ensure just a noop. assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount()); assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount()); // TODO: Though second unassign is noop, it's considered success, can noop be handled in a // better way? assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount()); assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount()); }
@Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient. public void testSocketTimeout() throws Exception { final TableName tableName = TableName.valueOf(this.name.getMethodName()); final RegionInfo hri = createRegionInfo(tableName, 1); // collect AM metrics before test collectAssignmentManagerMetrics(); rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3)); waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1)); // exception.expect(ServerCrashException.class); waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false))); assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount()); assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount()); assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount()); assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount()); }