/** * @return Maximum number of regions in transition */ private int getMaxRegionsInTransition() { int numRegions = this.assignmentManager.getRegionStates().getRegionAssignments().size(); return Math.max((int) Math.floor(numRegions * this.maxRitPercent), 1); }
if (this.assignmentManager.hasRegionsInTransition()) { List<RegionStateNode> regionsInTransition = assignmentManager.getRegionsInTransition(); boolean metaInTransition = assignmentManager.isMetaRegionInTransition(); String prefix = force && !metaInTransition ? "R" : "Not r"; List<RegionStateNode> toPrint = regionsInTransition; this.assignmentManager.getRegionStates().getAssignmentsByTable(!isByTable); this.assignmentManager.moveAsync(plan); } catch (HBaseIOException hioe) {
private void updateFailedAssignments() { // Kick all regions in FAILED_OPEN state List<RegionInfo> stuckAssignments = Lists.newArrayList(); for (RegionStateNode state : masterServices.getAssignmentManager().getRegionStates() .getRegionsInTransition()) { if (state.isStuck()) { stuckAssignments.add(state.getRegionInfo()); } } for (RegionInfo region : stuckAssignments) { LOG.info("Retrying assignment of " + region); try { masterServices.getAssignmentManager().unassign(region); } catch (IOException e) { LOG.warn("Unable to reassign " + region, e); } } }
private boolean incrementAndCheckMaxAttempts(MasterProcedureEnv env, RegionStateNode regionNode) { int retries = env.getAssignmentManager().getRegionStates().addToFailedOpen(regionNode) .incrementAndGetRetries(); int max = env.getAssignmentManager().getAssignMaxAttempts(); LOG.info("Retry={} of max={}; {}; {}", retries, max, this, regionNode.toShortString()); return retries >= max; }
/** * Create round-robin assigns. Use on table creation to distribute out regions across cluster. * @return AssignProcedures made out of the passed in <code>hris</code> and a call to the balancer * to populate the assigns with targets chosen using round-robin (default balancer * scheme). If at assign-time, the target chosen is no longer up, thats fine, the * AssignProcedure will ask the balancer for a new target, and so on. */ public TransitRegionStateProcedure[] createRoundRobinAssignProcedures(List<RegionInfo> hris, List<ServerName> serversToExclude) { if (hris.isEmpty()) { return new TransitRegionStateProcedure[0]; } if (serversToExclude != null && this.master.getServerManager().getOnlineServersList().size() == 1) { LOG.debug("Only one region server found and hence going ahead with the assignment"); serversToExclude = null; } try { // Ask the balancer to assign our regions. Pass the regions en masse. The balancer can do // a better job if it has all the assignments in the one lump. Map<ServerName, List<RegionInfo>> assignments = getBalancer().roundRobinAssignment(hris, this.master.getServerManager().createDestinationServersList(serversToExclude)); // Return mid-method! return createAssignProcedures(assignments); } catch (HBaseIOException hioe) { LOG.warn("Failed roundRobinAssignment", hioe); } // If an error above, fall-through to this simpler assign. Last resort. return createAssignProcedures(hris); }
LOG.debug("Not running balancer because " + groupRIT.size() + " region(s) in transition: " + StringUtils.abbreviate( master.getAssignmentManager().getRegionStates().getRegionsInTransition().toString(), 256)); return false; for (RegionPlan plan: plans) { LOG.info("balance " + plan); assignmentManager.moveAsync(plan);
@Test public void testWholesomeMerge() throws Exception { LOG.info("Starting " + name.getMethodName()); final TableName tableName = TableName.valueOf(name.getMethodName()); // Create table and load data. Table table = createTableAndLoadData(MASTER, tableName); // Merge 1st and 2nd region mergeRegionsAndVerifyRegionNum(MASTER, tableName, 0, 1, INITIAL_REGION_NUM - 1); // Merge 2nd and 3th region PairOfSameType<RegionInfo> mergedRegions = mergeRegionsAndVerifyRegionNum(MASTER, tableName, 1, 2, INITIAL_REGION_NUM - 2); verifyRowCount(table, ROWSIZE); // Randomly choose one of the two merged regions RegionInfo hri = RandomUtils.nextBoolean() ? mergedRegions.getFirst() : mergedRegions.getSecond(); MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster(); AssignmentManager am = cluster.getMaster().getAssignmentManager(); RegionStates regionStates = am.getRegionStates(); // We should not be able to assign it again am.assign(hri); assertFalse("Merged region can't be assigned", regionStates.isRegionInTransition(hri)); // We should not be able to unassign it either am.unassign(hri); assertFalse("Merged region can't be unassigned", regionStates.isRegionInTransition(hri)); table.close(); }
if (master.getAssignmentManager().isTableDisabled(table)) { LOG.debug("Skipping move regions because the table" + table + " is disabled."); continue; master.getAssignmentManager().getRegionStates().getRegionsOfTable(table)) { LOG.info("Moving region " + region.getShortNameToLog() + " to RSGroup " + targetGroup); master.getAssignmentManager().move(region);
/** * @return List of Regions associated with this <code>server</code>. */ private List<RegionInfo> getRegions(final Address server) { LinkedList<RegionInfo> regions = new LinkedList<>(); for (Map.Entry<RegionInfo, ServerName> el : master.getAssignmentManager().getRegionStates().getRegionAssignments().entrySet()) { if (el.getValue() == null) { continue; } if (el.getValue().getAddress().equals(server)) { addRegion(regions, el.getKey()); } } for (RegionStateNode state : master.getAssignmentManager().getRegionsInTransition()) { if (state.getRegionLocation().getAddress().equals(server)) { addRegion(regions, state.getRegionInfo()); } } return regions; }
List<RegionInfo> regions = am.getRegionStates().getRegionsOfTable(tableName); am.unassign(b); am.offlineRegion(b); try {
@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)); } }
private void testFailedOpen(final TableName tableName, final MockRSExecutor executor) throws Exception { final RegionInfo hri = createRegionInfo(tableName, 1); // Test Assign operation failure rsDispatcher.setMockRsExecutor(executor); try { waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); fail("unexpected assign completion"); } catch (RetriesExhaustedException e) { // expected exception LOG.info("REGION STATE " + am.getRegionStates().getRegionStateNode(hri)); LOG.info("expected exception from assign operation: " + e.getMessage(), e); assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen()); } }
@VisibleForTesting public void move(final byte[] encodedRegionName, byte[] destServerName) throws HBaseIOException { RegionState regionState = assignmentManager.getRegionStates(). getRegionState(Bytes.toString(encodedRegionName)); List<ServerName> exclude = hri.getTable().isSystemTable() ? assignmentManager.getExcludedServersForSystemTable() : new ArrayList<>(1); if (destServerName != null && exclude.contains(ServerName.valueOf(Bytes.toString(destServerName)))) { Future<byte []> future = this.assignmentManager.moveAsync(rp); try {
.getRegionStates().getRegionsInTransitionOrderedByTimestamp(); RegionInTransitionStat ritStat = assignmentManager.computeRegionInTransitionStat(); .getRegionStates().getFailedOpen(rs.getRegion()); if (regionFailedOpen != null) { retryStatus = Integer.toString(regionFailedOpen.getRetries()); assignmentManager.getConfiguration())), jamonWriter);
/** * It is possible that when AM send assign meta request to a RS successfully, but RS can not send * back any response, which cause master startup hangs forever */ @Test public void testAssignMetaAndCrashBeforeResponse() throws Exception { tearDown(); // See setUp(), start HBase until set up meta util = new HBaseTestingUtility(); this.executor = Executors.newSingleThreadScheduledExecutor(); setupConfiguration(util.getConfiguration()); master = new MockMasterServices(util.getConfiguration(), this.regionsToRegionServers); rsDispatcher = new MockRSProcedureDispatcher(master); master.start(NSERVERS, rsDispatcher); am = master.getAssignmentManager(); // Assign meta rsDispatcher.setMockRsExecutor(new HangThenRSRestartExecutor()); am.assign(RegionInfoBuilder.FIRST_META_REGIONINFO); assertEquals(true, am.isMetaAssigned()); // set it back as default, see setUpMeta() am.wakeMetaLoadedEvent(); } }
@Override public Void call() throws Exception { AssignmentManager am = env.getAssignmentManager(); // try to simulate a master restart by removing the ServerManager states about seqIDs for (RegionState regionState: am.getRegionStates().getRegionStates()) { env.getMasterServices().getServerManager().removeRegion(regionState.getRegion()); } am.stop(); master.setInitialized(false); return null; } },
env.getAssignmentManager().getRegionStates().getRegionsOfTable(tableName, true); if (regionInfo.getReplicaId() > (regionReplicaCount - 1)) { env.getAssignmentManager().getRegionStates().deleteRegion(regionInfo); addChildProcedure(env.getAssignmentManager().createAssignProcedures(regionsOfTable)); setNextState(EnableTableState.ENABLE_TABLE_SET_ENABLED_TABLE_STATE); break;
private void dumpRIT(HMaster master, PrintWriter out) { AssignmentManager am = master.getAssignmentManager(); if (am == null) { out.println("AssignmentManager is not initialized"); return; } for (RegionStateNode rs : am.getRegionsInTransition()) { String rid = rs.getRegionInfo().getEncodedName(); out.println("Region " + rid + ": " + rs.toDescriptiveString()); } }
for (ServerName server : getExcludedServersForSystemTable()) { if (master.getServerManager().isServerDead(server)) { List<RegionInfo> regionsShouldMove = getSystemTables(server); if (!regionsShouldMove.isEmpty()) { for (RegionInfo regionInfo : regionsShouldMove) { moveAsync(plan); } else { plans.add(plan); LOG.info("Async MOVE of {} to newer Server={}", plan.getRegionInfo().getEncodedName(), server); moveAsync(plan);
protected void setUpMeta() throws Exception { rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); am.assign(RegionInfoBuilder.FIRST_META_REGIONINFO); am.wakeMetaLoadedEvent(); }