private void handleEnableTable() throws IOException, CoordinatedStateException, InterruptedException { // I could check table is disabling and if so, not enable but require // that user first finish disabling but that might be obnoxious. // Set table enabling flag up in zk. this.assignmentManager.getTableStateManager().setTableState(this.tableName, ZooKeeperProtos.Table.State.ENABLING); boolean done = false; ServerManager serverManager = ((HMaster)this.server).getServerManager(); // Get the regions of this table. We're done when all listed // tables are onlined. List<Pair<HRegionInfo, ServerName>> tableRegionsAndLocations; if (TableName.META_TABLE_NAME.equals(tableName)) { tableRegionsAndLocations = new MetaTableLocator().getMetaRegionsAndLocations( server.getZooKeeper()); } else { tableRegionsAndLocations = MetaTableAccessor.getTableRegionsAndLocations( server.getZooKeeper(), server.getConnection(), tableName, true); } int countOfRegionsInTable = tableRegionsAndLocations.size(); Map<HRegionInfo, ServerName> regionsToAssign = regionsToAssignWithServerName(tableRegionsAndLocations); if (services != null) { // need to potentially create some regions for the replicas List<HRegionInfo> unrecordedReplicas = AssignmentManager.replicaRegionsNotRecordedInMeta( new HashSet<HRegionInfo>(regionsToAssign.keySet()), services); Map<ServerName, List<HRegionInfo>> srvToUnassignedRegs = this.assignmentManager.getBalancer().roundRobinAssignment(unrecordedReplicas, serverManager.getOnlineServersList()); if (srvToUnassignedRegs != null) { for (Map.Entry<ServerName, List<HRegionInfo>> entry : srvToUnassignedRegs.entrySet()) { for (HRegionInfo h : entry.getValue()) { regionsToAssign.put(h, entry.getKey()); } } } } int regionsCount = regionsToAssign.size(); if (regionsCount == 0) { done = true; } LOG.info("Table '" + this.tableName + "' has " + countOfRegionsInTable + " regions, of which " + regionsCount + " are offline."); List<ServerName> onlineServers = serverManager.createDestinationServersList(); Map<ServerName, List<HRegionInfo>> bulkPlan = this.assignmentManager.getBalancer().retainAssignment(regionsToAssign, onlineServers); if (bulkPlan != null) { LOG.info("Bulk assigning " + regionsCount + " region(s) across " + bulkPlan.size() + " server(s), retainAssignment=true"); BulkAssigner ba = new GeneralBulkAssigner(this.server, bulkPlan, this.assignmentManager, true); try { if (ba.bulkAssign()) { done = true; } } catch (InterruptedException e) { LOG.warn("Enable operation was interrupted when enabling table '" + this.tableName + "'"); // Preserve the interrupt. Thread.currentThread().interrupt(); } } else { done = true; LOG.info("Balancer was unable to find suitable servers for table " + tableName + ", leaving unassigned"); } if (done) { // Flip the table to enabled. this.assignmentManager.getTableStateManager().setTableState( this.tableName, ZooKeeperProtos.Table.State.ENABLED); LOG.info("Table '" + this.tableName + "' was successfully enabled. Status: done=" + done); } else { LOG.warn("Table '" + this.tableName + "' wasn't successfully enabled. Status: done=" + done); } }
/** * Mark offline regions of the table online * @param env MasterProcedureEnv * @param tableName the target table * @return whether the operation is fully completed or being interrupted. * @throws IOException */ private static boolean markRegionsOnline(final MasterProcedureEnv env, final TableName tableName) throws IOException { final AssignmentManager assignmentManager = env.getMasterServices().getAssignmentManager(); final MasterServices masterServices = env.getMasterServices(); final ServerManager serverManager = masterServices.getServerManager(); boolean done = false; // Get the regions of this table. We're done when all listed // tables are onlined. List<Pair<HRegionInfo, ServerName>> tableRegionsAndLocations; if (TableName.META_TABLE_NAME.equals(tableName)) { tableRegionsAndLocations = new MetaTableLocator().getMetaRegionsAndLocations(masterServices.getZooKeeper()); } else { tableRegionsAndLocations = MetaTableAccessor.getTableRegionsAndLocations( masterServices.getZooKeeper(), masterServices.getConnection(), tableName, true); } int countOfRegionsInTable = tableRegionsAndLocations.size(); Map<HRegionInfo, ServerName> regionsToAssign = regionsToAssignWithServerName(env, tableRegionsAndLocations); // need to potentially create some regions for the replicas List<HRegionInfo> unrecordedReplicas = AssignmentManager.replicaRegionsNotRecordedInMeta(new HashSet<HRegionInfo>( regionsToAssign.keySet()), masterServices); Map<ServerName, List<HRegionInfo>> srvToUnassignedRegs = assignmentManager.getBalancer().roundRobinAssignment(unrecordedReplicas, serverManager.getOnlineServersList()); if (srvToUnassignedRegs != null) { for (Map.Entry<ServerName, List<HRegionInfo>> entry : srvToUnassignedRegs.entrySet()) { for (HRegionInfo h : entry.getValue()) { regionsToAssign.put(h, entry.getKey()); } } } int offlineRegionsCount = regionsToAssign.size(); LOG.info("Table '" + tableName + "' has " + countOfRegionsInTable + " regions, of which " + offlineRegionsCount + " are offline."); if (offlineRegionsCount == 0) { return true; } List<ServerName> onlineServers = serverManager.createDestinationServersList(); Map<ServerName, List<HRegionInfo>> bulkPlan = env.getMasterServices().getAssignmentManager().getBalancer() .retainAssignment(regionsToAssign, onlineServers); if (bulkPlan != null) { LOG.info("Bulk assigning " + offlineRegionsCount + " region(s) across " + bulkPlan.size() + " server(s), retainAssignment=true"); BulkAssigner ba = new GeneralBulkAssigner(masterServices, bulkPlan, assignmentManager, true); try { if (ba.bulkAssign()) { done = true; } } catch (InterruptedException e) { LOG.warn("Enable operation was interrupted when enabling table '" + tableName + "'"); // Preserve the interrupt. Thread.currentThread().interrupt(); } } else { LOG.info("Balancer was unable to find suitable servers for table " + tableName + ", leaving unassigned"); } return done; }
private void handleEnableTable() throws IOException, KeeperException, InterruptedException { // I could check table is disabling and if so, not enable but require // that user first finish disabling but that might be obnoxious. // Set table enabling flag up in zk. this.assignmentManager.getZKTable().setEnablingTable(this.tableName); boolean done = false; ServerManager serverManager = ((HMaster)this.server).getServerManager(); // Get the regions of this table. We're done when all listed // tables are onlined. List<Pair<HRegionInfo, ServerName>> tableRegionsAndLocations = MetaReader .getTableRegionsAndLocations(this.catalogTracker, tableName, true); int countOfRegionsInTable = tableRegionsAndLocations.size(); Map<HRegionInfo, ServerName> regionsToAssign = regionsToAssignWithServerName(tableRegionsAndLocations); int regionsCount = regionsToAssign.size(); if (regionsCount == 0) { done = true; } LOG.info("Table '" + this.tableName + "' has " + countOfRegionsInTable + " regions, of which " + regionsCount + " are offline."); List<ServerName> onlineServers = serverManager.createDestinationServersList(); Map<ServerName, List<HRegionInfo>> bulkPlan = this.assignmentManager.getBalancer().retainAssignment(regionsToAssign, onlineServers); LOG.info("Bulk assigning " + regionsCount + " region(s) across " + bulkPlan.size() + " server(s), retainAssignment=true"); BulkAssigner ba = new GeneralBulkAssigner(this.server, bulkPlan, this.assignmentManager, true); try { if (ba.bulkAssign()) { done = true; } } catch (InterruptedException e) { LOG.warn("Enable operation was interrupted when enabling table '" + this.tableName + "'"); // Preserve the interrupt. Thread.currentThread().interrupt(); } if (done) { // Flip the table to enabled. this.assignmentManager.getZKTable().setEnabledTable( this.tableName); LOG.info("Table '" + this.tableName + "' was successfully enabled. Status: done=" + done); } else { LOG.warn("Table '" + this.tableName + "' wasn't successfully enabled. Status: done=" + done); } }
private void handleEnableTable() throws IOException, CoordinatedStateException, InterruptedException { // I could check table is disabling and if so, not enable but require // that user first finish disabling but that might be obnoxious. // Set table enabling flag up in zk. this.assignmentManager.getTableStateManager().setTableState(this.tableName, ZooKeeperProtos.Table.State.ENABLING); boolean done = false; ServerManager serverManager = ((HMaster)this.server).getServerManager(); // Get the regions of this table. We're done when all listed // tables are onlined. List<Pair<HRegionInfo, ServerName>> tableRegionsAndLocations = MetaReader .getTableRegionsAndLocations(this.catalogTracker, tableName, true); int countOfRegionsInTable = tableRegionsAndLocations.size(); Map<HRegionInfo, ServerName> regionsToAssign = regionsToAssignWithServerName(tableRegionsAndLocations); int regionsCount = regionsToAssign.size(); if (regionsCount == 0) { done = true; } LOG.info("Table '" + this.tableName + "' has " + countOfRegionsInTable + " regions, of which " + regionsCount + " are offline."); List<ServerName> onlineServers = serverManager.createDestinationServersList(); Map<ServerName, List<HRegionInfo>> bulkPlan = this.assignmentManager.getBalancer().retainAssignment(regionsToAssign, onlineServers); LOG.info("Bulk assigning " + regionsCount + " region(s) across " + bulkPlan.size() + " server(s), retainAssignment=true"); BulkAssigner ba = new GeneralBulkAssigner(this.server, bulkPlan, this.assignmentManager, true); try { if (ba.bulkAssign()) { done = true; } } catch (InterruptedException e) { LOG.warn("Enable operation was interrupted when enabling table '" + this.tableName + "'"); // Preserve the interrupt. Thread.currentThread().interrupt(); } if (done) { // Flip the table to enabled. this.assignmentManager.getTableStateManager().setTableState( this.tableName, ZooKeeperProtos.Table.State.ENABLED); LOG.info("Table '" + this.tableName + "' was successfully enabled. Status: done=" + done); } else { LOG.warn("Table '" + this.tableName + "' wasn't successfully enabled. Status: done=" + done); } }