return null; default: return super.execCloseRegion(server, regionName);
@Override protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq) throws IOException { if (this.invocations++ > 0) { // Return w/o problem the second time through here. return super.execOpenRegion(server, openReq); } // The procedure on master will just hang forever because nothing comes back // from the RS in this case. LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout"); executor.schedule(new Runnable() { @Override public void run() { LOG.info("Sending in CRASH of " + server); doCrash(server); } }, 1, TimeUnit.SECONDS); return null; } }
@Override public ExecuteProceduresResponse sendRequest(ServerName server, ExecuteProceduresRequest req) throws IOException { // SocketTimeoutException should be a temporary problem // unless the server will be declared dead. if (sockTimeoutRetries++ < maxSocketTimeoutRetries) { if (sockTimeoutRetries == 1) { assertNotEquals(lastServer, server); } lastServer = server; LOG.debug("Socket timeout for server=" + server + " retries=" + sockTimeoutRetries); throw new SocketTimeoutException("simulate socket timeout"); } else if (serverRetries++ < maxServerRetries) { LOG.info("Mark server=" + server + " as dead. serverRetries=" + serverRetries); master.getServerManager().moveFromOnlineToDeadServers(server); sockTimeoutRetries = 0; throw new SocketTimeoutException("simulate socket timeout"); } else { return super.sendRequest(server, req); } } }
rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); waitOnFuture(submitProcedure(createAssignProcedure(hri)));
@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(createAssignProcedure(hri))); final Future<byte[]> futureA = submitProcedure(createUnassignProcedure(hri)); // 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(createUnassignProcedure(hri)); 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()); }
@Test public void testAssignAnAssignedRegion() throws Exception { final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion"); final RegionInfo hri = createRegionInfo(tableName, 1); // collect AM metrics before test collectAssignmentManagerMetrics(); rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); Future<byte[]> futureA = submitProcedure(createAssignProcedure(hri)); // wait first assign waitOnFuture(futureA); am.getRegionStates().isRegionInState(hri, State.OPEN); // Second should be a noop. We should recognize region is already OPEN internally // and skip out doing nothing. // wait second assign Future<byte[]> futureB = submitProcedure(createAssignProcedure(hri)); waitOnFuture(futureB); am.getRegionStates().isRegionInState(hri, State.OPEN); // TODO: What else can we do to ensure just a noop. // TODO: Though second assign is noop, it's considered success, can noop be handled in a // better way? assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount()); assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount()); }
@Override protected RegionOpeningState execOpenRegion(final ServerName server, RegionOpenInfo openReq) throws IOException { if (this.invocations++ > 0) { // Return w/o problem the second time through here. return super.execOpenRegion(server, openReq); } // The procedure on master will just hang forever because nothing comes back // from the RS in this case. LOG.info("Return null response from serverName=" + server + "; means STUCK...TODO timeout"); executor.schedule(new Runnable() { @Override public void run() { LOG.info("Restarting RS of " + server); doRestart(server); } }, 1, TimeUnit.SECONDS); return null; } }
protected void setUpMeta() throws Exception { rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); am.assign(RegionInfoBuilder.FIRST_META_REGIONINFO); am.wakeMetaLoadedEvent(); }
@Test public void testAssignWithGoodExec() throws Exception { // collect AM metrics before test collectAssignmentManagerMetrics(); testAssign(new GoodRsExecutor()); assertEquals(assignSubmittedCount + NREGIONS, assignProcMetrics.getSubmittedCounter().getCount()); assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount()); }