HBASE-5422 StartupBulkAssigner would cause a lot of timeout on RIT when assigning large numbers of regions (timeout = 3 mins)

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1292409 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael Stack 2012-02-22 17:29:26 +00:00
parent 0f708f7370
commit 7b5ec59eda
2 changed files with 25 additions and 3 deletions

View File

@ -59,11 +59,12 @@ import org.apache.hadoop.hbase.catalog.CatalogTracker;
import org.apache.hadoop.hbase.catalog.MetaReader; import org.apache.hadoop.hbase.catalog.MetaReader;
import org.apache.hadoop.hbase.catalog.RootLocationEditor; import org.apache.hadoop.hbase.catalog.RootLocationEditor;
import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.executor.EventHandler.EventType;
import org.apache.hadoop.hbase.executor.EventHandler; import org.apache.hadoop.hbase.executor.EventHandler;
import org.apache.hadoop.hbase.executor.EventHandler.EventType;
import org.apache.hadoop.hbase.executor.ExecutorService; import org.apache.hadoop.hbase.executor.ExecutorService;
import org.apache.hadoop.hbase.executor.RegionTransitionData; import org.apache.hadoop.hbase.executor.RegionTransitionData;
import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException; import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException;
import org.apache.hadoop.hbase.master.AssignmentManager.RegionState;
import org.apache.hadoop.hbase.master.AssignmentManager.RegionState.State; import org.apache.hadoop.hbase.master.AssignmentManager.RegionState.State;
import org.apache.hadoop.hbase.master.handler.ClosedRegionHandler; import org.apache.hadoop.hbase.master.handler.ClosedRegionHandler;
import org.apache.hadoop.hbase.master.handler.DisableTableHandler; import org.apache.hadoop.hbase.master.handler.DisableTableHandler;
@ -268,6 +269,15 @@ public class AssignmentManager extends ZooKeeperListener {
} }
} }
/**
* Add a map of region plans.
*/
public void addPlans(Map<String, RegionPlan> plans) {
synchronized (regionPlans) {
regionPlans.putAll(plans);
}
}
/** /**
* Set the list of regions that will be reopened * Set the list of regions that will be reopened
* because of an update in table schema * because of an update in table schema
@ -1341,6 +1351,15 @@ public class AssignmentManager extends ZooKeeperListener {
states.add(forceRegionStateToOffline(region)); states.add(forceRegionStateToOffline(region));
} }
} }
// Add region plans, so we can updateTimers when one region is opened so
// that unnecessary timeout on RIT is reduced.
Map<String, RegionPlan> plans=new HashMap<String, RegionPlan>();
for (HRegionInfo region : regions) {
plans.put(region.getEncodedName(), new RegionPlan(region, null,
destination));
}
this.addPlans(plans);
// Presumption is that only this thread will be updating the state at this // Presumption is that only this thread will be updating the state at this
// time; i.e. handlers on backend won't be trying to set it to OPEN, etc. // time; i.e. handlers on backend won't be trying to set it to OPEN, etc.
AtomicInteger counter = new AtomicInteger(0); AtomicInteger counter = new AtomicInteger(0);

View File

@ -20,6 +20,7 @@
package org.apache.hadoop.hbase.master; package org.apache.hadoop.hbase.master;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
@ -56,12 +57,14 @@ public class BulkReOpen extends BulkAssigner {
for (Map.Entry<ServerName, List<HRegionInfo>> e : rsToRegions for (Map.Entry<ServerName, List<HRegionInfo>> e : rsToRegions
.entrySet()) { .entrySet()) {
final List<HRegionInfo> hris = e.getValue(); final List<HRegionInfo> hris = e.getValue();
// add a plan for each of the regions that needs to be reopened // add plans for the regions that need to be reopened
Map<String, RegionPlan> plans = new HashMap<String, RegionPlan>();
for (HRegionInfo hri : hris) { for (HRegionInfo hri : hris) {
RegionPlan reOpenPlan = new RegionPlan(hri, null, RegionPlan reOpenPlan = new RegionPlan(hri, null,
assignmentManager.getRegionServerOfRegion(hri)); assignmentManager.getRegionServerOfRegion(hri));
assignmentManager.addPlan(hri.getEncodedName(), reOpenPlan); plans.put(hri.getEncodedName(), reOpenPlan);
} }
assignmentManager.addPlans(plans);
pool.execute(new Runnable() { pool.execute(new Runnable() {
public void run() { public void run() {
assignmentManager.unassign(hris); assignmentManager.unassign(hris);