Index: src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java (revision 1508127) +++ src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java (working copy) @@ -856,12 +856,12 @@ } /** - * 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 @@ desc.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY)); admin.createTable(desc, splitKeys); HTable ht = new HTable(TEST_UTIL.getConfiguration(), tableName); - Map regions = ht.getRegionsInfo(); + Map 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 regions2 = ht.getRegionLocations(); // Check the assignment. - HTable metaTable = new HTable(TEST_UTIL.getConfiguration(), - HConstants.META_TABLE_NAME); - List regionInfos = admin.getTableRegions(tableName); - Map serverMap = new HashMap(); - 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); + assertEquals(regions.size(), regions2.size()); + for (Map.Entry entry : regions.entrySet()) { + ServerName sn1 = regions2.get(entry.getKey()); + ServerName sn2 = entry.getValue(); + assertEquals(sn1, sn2); } - List> entryList = new ArrayList>( - serverMap.entrySet()); - Collections.sort(entryList, new Comparator>() { - public int compare(Map.Entry oa, - Map.Entry ob) { - return (oa.getValue() - ob.getValue()); - } - }); - assertTrue(entryList.size() == 3); - assertTrue((entryList.get(2).getValue() - entryList.get(0).getValue()) < 2); } /** Index: src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java (revision 1508127) +++ src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java (working copy) @@ -52,7 +52,7 @@ 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 @@ 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 @@ } 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 @@ for (Pair 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 @@ 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 @@ private final List 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 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); - } - } - }); + for (HRegionInfo region : regions) { + if (assignmentManager.isRegionInTransition(region) != null) { + continue; } - } else { - try { - assignmentManager.assignUserRegionsToOnlineServers(regions); - } catch (InterruptedException e) { - LOG.warn("Assignment was interrupted"); - Thread.currentThread().interrupt(); - } + final HRegionInfo hri = region; + pool.execute(new Runnable() { + public void run() { + assignmentManager.assign(hri, true, false, false); + } + }); } }