You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jx...@apache.org on 2012/10/24 17:50:55 UTC

svn commit: r1401744 - /hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java

Author: jxiang
Date: Wed Oct 24 15:50:55 2012
New Revision: 1401744

URL: http://svn.apache.org/viewvc?rev=1401744&view=rev
Log:
HBASE-6896 sync bulk and regular assigment handling socket timeout exception

Modified:
    hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java

Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java?rev=1401744&r1=1401743&r2=1401744&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java Wed Oct 24 15:50:55 2012
@@ -1248,7 +1248,7 @@ public class AssignmentManager extends Z
         long maxWaitTime = System.currentTimeMillis() +
           this.server.getConfiguration().
             getLong("hbase.regionserver.rpc.startup.waittime", 60000);
-        while (!this.server.isStopped()) {
+        for (int i = 1; i <= maximumAttempts && !server.isStopped(); i++) {
           try {
             List<RegionOpeningState> regionOpeningStateList = serverManager
               .sendRegionOpen(destination, regionOpenInfos);
@@ -1256,10 +1256,10 @@ public class AssignmentManager extends Z
               // Failed getting RPC connection to this server
               return false;
             }
-            for (int i = 0, n = regionOpeningStateList.size(); i < n; i++) {
-              RegionOpeningState openingState = regionOpeningStateList.get(i);
+            for (int k = 0, n = regionOpeningStateList.size(); k < n; k++) {
+              RegionOpeningState openingState = regionOpeningStateList.get(k);
               if (openingState != RegionOpeningState.OPENED) {
-                HRegionInfo region = regionOpenInfos.get(i).getFirst();
+                HRegionInfo region = regionOpenInfos.get(k).getFirst();
                 if (openingState == RegionOpeningState.ALREADY_OPENED) {
                   processAlreadyOpenedRegion(region, destination);
                 } else if (openingState == RegionOpeningState.FAILED_OPENING) {
@@ -1281,15 +1281,26 @@ public class AssignmentManager extends Z
               // No need to retry, the region server is a goner.
               return false;
             } else if (e instanceof ServerNotRunningYetException) {
-              // This is the one exception to retry.  For all else we should just fail
-              // the startup.
               long now = System.currentTimeMillis();
               if (now < maxWaitTime) {
                 LOG.debug("Server is not yet up; waiting up to " +
                   (maxWaitTime - now) + "ms", e);
                 Thread.sleep(100);
+                i--; // reset the try count
                 continue;
               }
+            } else if (e instanceof java.net.SocketTimeoutException
+                && this.serverManager.isServerOnline(destination)) {
+              // In case socket is timed out and the region server is still online,
+              // the openRegion RPC could have been accepted by the server and
+              // just the response didn't go through.  So we will retry to
+              // open the region on the same server.
+              if (LOG.isDebugEnabled()) {
+                LOG.debug("Bulk assigner openRegion() to " + destination
+                  + " has timed out, but the regions might"
+                  + " already be opened on it.", e);
+              }
+              continue;
             }
             throw e;
           }
@@ -1417,7 +1428,7 @@ public class AssignmentManager extends Z
     RegionPlan plan = null;
     long maxRegionServerStartupWaitTime = -1;
     HRegionInfo region = state.getRegion();
-    for (int i = 1; i <= this.maximumAttempts; i++) {
+    for (int i = 1; i <= maximumAttempts && !server.isStopped(); i++) {
       if (plan == null) { // Get a server for the region at first
         plan = getRegionPlan(region, forceNewPlan);
       }
@@ -1511,7 +1522,7 @@ public class AssignmentManager extends Z
             && this.serverManager.isServerOnline(plan.getDestination())) {
           // In case socket is timed out and the region server is still online,
           // the openRegion RPC could have been accepted by the server and
-          // just the response isn't gone through.  So we will retry to
+          // just the response didn't go through.  So we will retry to
           // open the region on the same server to avoid possible
           // double assignment.
           socketTimedOut = true;