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() {