Repository: hbase
Updated Branches:
  refs/heads/branch-1.0 d1b0dbee6 -> b6cd92396


HBASE-13635 Regions stuck in transition because master is incorrectly assumed 
dead

Summary:
Requests to tell master that meta is moved can be blocked behind other requests 
that are trying to mutate meta.
This causes a dead lock and the master is assumed dead. However the master 
stays up the whole time.

This patch adds prioritization onto reporting meta moves. It should allow meta 
to make progress.

Test Plan: unit tests.

Differential Revision: https://reviews.facebook.net/D38109


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/b6cd9239
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/b6cd9239
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/b6cd9239

Branch: refs/heads/branch-1.0
Commit: b6cd9239667e2596da24e54dda10a56975d088a1
Parents: d1b0dbe
Author: Elliott Clark <[email protected]>
Authored: Wed May 6 11:27:33 2015 -0700
Committer: Elliott Clark <[email protected]>
Committed: Mon May 11 15:54:52 2015 -0700

----------------------------------------------------------------------
 .../hadoop/hbase/ipc/RWQueueRpcExecutor.java    |  3 ++
 .../AnnotationReadingPriorityFunction.java      | 21 ++++++++
 .../hbase/regionserver/TestQosFunction.java     | 52 ++++++++++++++++++++
 .../apache/hadoop/hbase/wal/TestWALFactory.java |  1 +
 4 files changed, 77 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/b6cd9239/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RWQueueRpcExecutor.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RWQueueRpcExecutor.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RWQueueRpcExecutor.java
index 2b58680..a0ea160 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RWQueueRpcExecutor.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/RWQueueRpcExecutor.java
@@ -187,6 +187,9 @@ public class RWQueueRpcExecutor extends RpcExecutor {
     if (methodName.equalsIgnoreCase("mutate")) {
       return true;
     }
+    if (methodName.equalsIgnoreCase("ReportRegionStateTransition")) {
+      return true;
+    }
     return false;
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/b6cd9239/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.java
index ddeabfa..8e96af9 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.java
@@ -27,6 +27,11 @@ import 
org.apache.hadoop.hbase.classification.InterfaceAudience;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.ipc.PriorityFunction;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
+import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;
+import 
org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest;
+import 
org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos.RegionStateTransition;
 import 
org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CloseRegionRequest;
 import 
org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CompactRegionRequest;
 import 
org.apache.hadoop.hbase.protobuf.generated.AdminProtos.FlushRegionRequest;
@@ -205,6 +210,22 @@ class AnnotationReadingPriorityFunction implements 
PriorityFunction {
         return HConstants.SYSTEMTABLE_QOS;
       }
     }
+
+    // If meta is moving then all the rest of report the report state 
transitions will be
+    // blocked. We shouldn't be in the same queue.
+    if (methodName.equalsIgnoreCase("ReportRegionStateTransition")) { // 
Regions are moving
+      ReportRegionStateTransitionRequest tRequest = 
(ReportRegionStateTransitionRequest) param;
+      for (RegionStateTransition transition : tRequest.getTransitionList()) {
+        if (transition.getRegionInfoList() != null) {
+          for (HBaseProtos.RegionInfo info : transition.getRegionInfoList()) {
+            TableName tn = ProtobufUtil.toTableName(info.getTableName());
+            if (tn.isSystemTable()) {
+              return HConstants.SYSTEMTABLE_QOS;
+            }
+          }
+        }
+      }
+    }
     return HConstants.NORMAL_QOS;
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/b6cd9239/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestQosFunction.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestQosFunction.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestQosFunction.java
index dde3e37..2daba7a 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestQosFunction.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestQosFunction.java
@@ -22,9 +22,16 @@ import static org.mockito.Mockito.when;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
+import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;
+import org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiRequest;
 import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;
+import org.apache.hadoop.hbase.util.Bytes;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.mockito.Mockito;
@@ -52,6 +59,51 @@ public class TestQosFunction {
     checkMethod("OpenRegion", HConstants.ADMIN_QOS, qosFunction);
     // Check multi works.
     checkMethod("Multi", HConstants.NORMAL_QOS, qosFunction, 
MultiRequest.getDefaultInstance());
+
+  }
+
+  @Test
+  public void testRegionInTransition() {
+    Configuration conf = HBaseConfiguration.create();
+    RSRpcServices rpcServices = Mockito.mock(RSRpcServices.class);
+    when(rpcServices.getConfiguration()).thenReturn(conf);
+
+    AnnotationReadingPriorityFunction qosFunction =
+        new AnnotationReadingPriorityFunction(rpcServices);
+
+    // Check ReportRegionInTransition
+    HBaseProtos.RegionInfo meta_ri = 
HRegionInfo.convert(HRegionInfo.FIRST_META_REGIONINFO);
+    HBaseProtos.RegionInfo normal_ri = HRegionInfo.convert(
+        new HRegionInfo(TableName.valueOf("test:table"),
+            Bytes.toBytes("a"), Bytes.toBytes("b"), false));
+
+
+    RegionServerStatusProtos.RegionStateTransition metaTransition = 
RegionServerStatusProtos
+        .RegionStateTransition.newBuilder()
+        .addRegionInfo(meta_ri)
+        
.setTransitionCode(RegionServerStatusProtos.RegionStateTransition.TransitionCode.CLOSED)
+        .build();
+
+    RegionServerStatusProtos.RegionStateTransition normalTransition = 
RegionServerStatusProtos
+        .RegionStateTransition.newBuilder()
+        .addRegionInfo(normal_ri)
+        
.setTransitionCode(RegionServerStatusProtos.RegionStateTransition.TransitionCode.CLOSED)
+        .build();
+
+    RegionServerStatusProtos.ReportRegionStateTransitionRequest 
metaTransitionRequest =
+        
RegionServerStatusProtos.ReportRegionStateTransitionRequest.newBuilder()
+            
.setServer(ProtobufUtil.toServerName(ServerName.valueOf("locahost:60020", 100)))
+            .addTransition(normalTransition)
+            .addTransition(metaTransition).build();
+
+    RegionServerStatusProtos.ReportRegionStateTransitionRequest 
normalTransitionRequest =
+        
RegionServerStatusProtos.ReportRegionStateTransitionRequest.newBuilder()
+            
.setServer(ProtobufUtil.toServerName(ServerName.valueOf("locahost:60020", 100)))
+            .addTransition(normalTransition).build();
+
+    final String reportFuncName = "ReportRegionStateTransition";
+    checkMethod(reportFuncName, HConstants.SYSTEMTABLE_QOS, qosFunction, 
metaTransitionRequest);
+    checkMethod(reportFuncName, HConstants.NORMAL_QOS, qosFunction, 
normalTransitionRequest);
   }
 
   private void checkMethod(final String methodName, final int expected,

http://git-wip-us.apache.org/repos/asf/hbase/blob/b6cd9239/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWALFactory.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWALFactory.java 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWALFactory.java
index b163bd5..c0aa15e 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWALFactory.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/wal/TestWALFactory.java
@@ -227,6 +227,7 @@ public class TestWALFactory {
         fail("This version of Hadoop supports neither Syncable.sync() " +
             "nor Syncable.hflush().");
       }
+
     }
     syncMethod.invoke(out, new Object[]{});
     FSDataInputStream in = fs.open(p);

Reply via email to