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);
+    }
   }
 
   /**


Reply via email to