Author: tedyu
Date: Tue Jul 30 17:42:12 2013
New Revision: 1508546
URL: http://svn.apache.org/r1508546
Log:
HBASE-9080 Retain assignment should be used when re-enabling table(s) (Ted Yu)
Modified:
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
Modified:
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
URL:
http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java?rev=1508546&r1=1508545&r2=1508546&view=diff
==============================================================================
---
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
(original)
+++
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
Tue Jul 30 17:42:12 2013
@@ -52,7 +52,7 @@ public class EnableTableHandler extends
private final String tableNameStr;
private final AssignmentManager assignmentManager;
private final CatalogTracker ct;
- private boolean retainAssignment = false;
+ private boolean skipTableStateCheck = false;
public EnableTableHandler(Server server, byte [] tableName,
CatalogTracker catalogTracker, AssignmentManager assignmentManager,
@@ -63,12 +63,12 @@ public class EnableTableHandler extends
this.tableNameStr = Bytes.toString(tableName);
this.ct = catalogTracker;
this.assignmentManager = assignmentManager;
- this.retainAssignment = skipTableStateCheck;
+ this.skipTableStateCheck = skipTableStateCheck;
// Check if table exists
if (!MetaReader.tableExists(catalogTracker, this.tableNameStr)) {
- // retainAssignment is true only during recovery. In normal case it is
+ // skipTableStateCheck is true only during recovery. In normal case it is
// false
- if (!this.retainAssignment) {
+ if (!this.skipTableStateCheck) {
throw new TableNotFoundException(tableNameStr);
}
try {
@@ -142,8 +142,7 @@ public class EnableTableHandler extends
}
LOG.info("Table has " + countOfRegionsInTable + " regions of which " +
regionsCount + " are offline.");
- BulkEnabler bd = new BulkEnabler(this.server, regions,
countOfRegionsInTable,
- this.retainAssignment);
+ BulkEnabler bd = new BulkEnabler(this.server, regions,
countOfRegionsInTable, true);
try {
if (bd.bulkAssign()) {
done = true;
@@ -174,7 +173,7 @@ public class EnableTableHandler extends
for (Pair<HRegionInfo, ServerName> regionLocation : regionsInMeta) {
HRegionInfo hri = regionLocation.getFirst();
ServerName sn = regionLocation.getSecond();
- if (this.retainAssignment) {
+ if (this.skipTableStateCheck) {
// Region may be available in enablingTableRegions during master
startup only.
if (enablingTableRegions != null &&
enablingTableRegions.contains(hri)) {
regions.add(hri);
@@ -186,6 +185,9 @@ public class EnableTableHandler extends
continue;
} else {
regions.add(hri);
+ if (sn != null && serverManager.isServerOnline(sn)) {
+ this.assignmentManager.addPlan(hri.getEncodedName(), new
RegionPlan(hri, null, sn));
+ }
}
}
return regions;
@@ -198,44 +200,26 @@ public class EnableTableHandler extends
private final List<HRegionInfo> regions;
// Count of regions in table at time this assign was launched.
private final int countOfRegionsInTable;
- private final boolean retainAssignment;
BulkEnabler(final Server server, final List<HRegionInfo> regions,
final int countOfRegionsInTable,final boolean retainAssignment) {
super(server);
this.regions = regions;
this.countOfRegionsInTable = countOfRegionsInTable;
- this.retainAssignment = retainAssignment;
}
@Override
protected void populatePool(ExecutorService pool) throws IOException {
- boolean roundRobinAssignment = this.server.getConfiguration().getBoolean(
- "hbase.master.enabletable.roundrobin", false);
-
- if (retainAssignment || !roundRobinAssignment) {
- for (HRegionInfo region : regions) {
- if (assignmentManager.isRegionInTransition(region) != null) {
- continue;
- }
- final HRegionInfo hri = region;
- pool.execute(new Runnable() {
- public void run() {
- if (retainAssignment) {
- assignmentManager.assign(hri, true, false, false);
- } else {
- assignmentManager.assign(hri, true);
- }
- }
- });
- }
- } else {
- try {
- assignmentManager.assignUserRegionsToOnlineServers(regions);
- } catch (InterruptedException e) {
- LOG.warn("Assignment was interrupted");
- Thread.currentThread().interrupt();
+ for (HRegionInfo region : regions) {
+ if (assignmentManager.isRegionInTransition(region) != null) {
+ continue;
}
+ final HRegionInfo hri = region;
+ pool.execute(new Runnable() {
+ public void run() {
+ assignmentManager.assign(hri, true, false, false);
+ }
+ });
}
}
Modified:
hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
URL:
http://svn.apache.org/viewvc/hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java?rev=1508546&r1=1508545&r2=1508546&view=diff
==============================================================================
---
hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
(original)
+++
hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java
Tue Jul 30 17:42:12 2013
@@ -856,12 +856,12 @@ public class TestAdmin {
}
/**
- * Test round-robin assignment on enableTable.
+ * Test retain assignment on enableTable.
*
* @throws IOException
*/
@Test
- public void testEnableTableRoundRobinAssignment() throws IOException {
+ public void testEnableTableRetainAssignment() throws IOException,
InterruptedException {
byte[] tableName = Bytes.toBytes("testEnableTableAssignment");
byte[][] splitKeys = { new byte[] { 1, 1, 1 }, new byte[] { 2, 2, 2 },
new byte[] { 3, 3, 3 }, new byte[] { 4, 4, 4 }, new byte[] { 5, 5, 5 },
@@ -872,42 +872,22 @@ public class TestAdmin {
desc.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY));
admin.createTable(desc, splitKeys);
HTable ht = new HTable(TEST_UTIL.getConfiguration(), tableName);
- Map<HRegionInfo, HServerAddress> regions = ht.getRegionsInfo();
+ Map<HRegionInfo, ServerName> regions = ht.getRegionLocations();
assertEquals("Tried to create " + expectedRegions + " regions "
+ "but only found " + regions.size(), expectedRegions, regions.size());
// Disable table.
admin.disableTable(tableName);
- // Enable table, use round-robin assignment to assign regions.
+ // Enable table, use retain assignment to assign regions.
admin.enableTable(tableName);
+ Map<HRegionInfo, ServerName> regions2 = ht.getRegionLocations();
// Check the assignment.
- HTable metaTable = new HTable(TEST_UTIL.getConfiguration(),
- HConstants.META_TABLE_NAME);
- List<HRegionInfo> regionInfos = admin.getTableRegions(tableName);
- Map<String, Integer> serverMap = new HashMap<String, Integer>();
- for (int i = 0, j = regionInfos.size(); i < j; i++) {
- HRegionInfo hri = regionInfos.get(i);
- Get get = new Get(hri.getRegionName());
- Result result = metaTable.get(get);
- String server = Bytes.toString(result.getValue(HConstants.CATALOG_FAMILY,
- HConstants.SERVER_QUALIFIER));
- Integer regioncount = serverMap.get(server);
- if (regioncount == null) {
- regioncount = 0;
- }
- regioncount++;
- serverMap.put(server, regioncount);
- }
- List<Map.Entry<String, Integer>> entryList = new
ArrayList<Map.Entry<String, Integer>>(
- serverMap.entrySet());
- Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {
- public int compare(Map.Entry<String, Integer> oa,
- Map.Entry<String, Integer> ob) {
- return (oa.getValue() - ob.getValue());
- }
- });
- assertTrue(entryList.size() == 3);
- assertTrue((entryList.get(2).getValue() - entryList.get(0).getValue()) <
2);
+ assertEquals(regions.size(), regions2.size());
+ for (Map.Entry<HRegionInfo, ServerName> entry : regions.entrySet()) {
+ ServerName sn1 = regions2.get(entry.getKey());
+ ServerName sn2 = entry.getValue();
+ assertEquals(sn1, sn2);
+ }
}
/**