You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ns...@apache.org on 2011/10/25 00:30:57 UTC

svn commit: r1188422 - in /hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master: ServerManager.java handler/MasterCloseRegionHandler.java

Author: nspiegelberg
Date: Mon Oct 24 22:30:57 2011
New Revision: 1188422

URL: http://svn.apache.org/viewvc?rev=1188422&view=rev
Log:
Fix why online schema change didn't preserve locality

**** 89 MASTER ONLY ****

Summary:
rH17734 (Port online schema changes to 89) has some problem to preserve
locality.

There are 2 code path to process RegionClose event, which needs to preserve
locality.

path #1: If the master issues a close region operation, the region server will
close that region and update the zk. The master watches the zk event and handle
the region close event properly.

path #2:  For other reasons ( e.g RS cannot open region), the region server
wants to close this region. The region server will send the msg MSG_REPORT_CLOSE
to master. The master will update the region status as closed for this region.

rH17734 only updates the code path #2 for preserving locality after restart.
But for online schema changes, it actually go through the code path #1.
That's why we lost the locality after online schema change.

The solution is to preserve the locality in the common code path for path #1
and path #2

Test Plan:
Tested in dev cluster.
Running all the unit test now

Reviewers: kannan, mbautin

Reviewed By: kannan

CC: hbase-eng@lists, kannan

Differential Revision: 347074

Task ID: 766545

Modified:
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/handler/MasterCloseRegionHandler.java

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java?rev=1188422&r1=1188421&r2=1188422&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java Mon Oct 24 22:30:57 2011
@@ -506,10 +506,7 @@ public class ServerManager {
           break;
 
         case MSG_REPORT_CLOSE:
-          processRegionClose(region);
-            this.master.getRegionManager().getThrottledReopener(
-                  region.getTableDesc().getNameAsString()).
-                  addPreferredAssignmentForReopen(region, serverInfo);
+          processRegionClose(serverInfo, region);
           break;
 
         case MSG_REPORT_SPLIT:
@@ -675,11 +672,11 @@ public class ServerManager {
     }
   }
 
-  /*
+  /**
+   * @param serverInfo
    * @param region
-   * @throws Exception
    */
-  public void processRegionClose(HRegionInfo region) {
+  public void processRegionClose(HServerInfo serverInfo, HRegionInfo region) {
     synchronized (this.master.getRegionManager()) {
       if (region.isRootRegion()) {
         // Root region
@@ -709,6 +706,15 @@ public class ServerManager {
       RegionServerOperation op =
         new ProcessRegionClose(master, region, offlineRegion, reassignRegion);
       this.master.getRegionServerOperationQueue().put(op);
+
+      if (reassignRegion) {
+        // add this region back to preferred assignment
+        ThrottledRegionReopener reopener = this.master.getRegionManager().
+          getThrottledReopener(region.getTableDesc().getNameAsString());
+        if (reopener != null) {
+          reopener.addPreferredAssignmentForReopen(region, serverInfo);
+        }
+      }
     }
   }
 

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/handler/MasterCloseRegionHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/handler/MasterCloseRegionHandler.java?rev=1188422&r1=1188421&r2=1188422&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/handler/MasterCloseRegionHandler.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/master/handler/MasterCloseRegionHandler.java Mon Oct 24 22:30:57 2011
@@ -20,9 +20,12 @@
 package org.apache.hadoop.hbase.master.handler;
 
 import java.io.IOException;
+import java.util.ArrayList;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.HMsg;
+import org.apache.hadoop.hbase.HServerInfo;
 import org.apache.hadoop.hbase.executor.RegionTransitionEventData;
 import org.apache.hadoop.hbase.executor.HBaseEventHandler;
 import org.apache.hadoop.hbase.master.HMaster;
@@ -82,10 +85,18 @@ public class MasterCloseRegionHandler ex
     } catch (IOException e) {
       LOG.error("Could not deserialize additional args for Close region", e);
     }
+
+    String serverName = hbEventData.getRsName();
+    HServerInfo serverInfo = serverManager.getServerInfo(serverName);
+
     // process the region close - this will cause the reopening of the
     // region as a part of the heartbeat of some RS
-    serverManager.processRegionClose(hbEventData.getHmsg().getRegionInfo());
-    LOG.info("Processed close of region " + hbEventData.getHmsg().getRegionInfo().getRegionNameAsString());
+    serverManager.processRegionClose(serverInfo,
+        hbEventData.getHmsg().getRegionInfo());
+
+    LOG.info("Processed close of region " +
+        hbEventData.getHmsg().getRegionInfo().getRegionNameAsString() +
+        " by region server: " + serverName);
   }
 
   public String getRegionName() {