You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by to...@apache.org on 2020/08/10 04:21:43 UTC

[hbase] branch HBASE-11288.branch-2 updated (1bd3e1a -> 075bea4)

This is an automated email from the ASF dual-hosted git repository.

toffer pushed a change to branch HBASE-11288.branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git.


    from 1bd3e1a  fixed TestAssignmentManagerMetrics
     new 87e2bb7  Some extra fixes as precaution
     new deeb817  missing states requirining waiting for root loaded
     new c09fb1c  made reportRegionStateTransition retry delays a bit smarter
     new 075bea4  added root priority and executor on master

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/hadoop/hbase/HTableDescriptor.java  |  6 +++-
 .../hadoop/hbase/client/AsyncClientScanner.java    |  4 +--
 .../hbase/client/ConnectionImplementation.java     |  8 ++++-
 .../org/apache/hadoop/hbase/client/HBaseAdmin.java |  4 ++-
 .../apache/hadoop/hbase/client/MasterCallable.java |  8 +++++
 .../hadoop/hbase/client/RawAsyncHBaseAdmin.java    |  8 ++---
 .../hadoop/hbase/client/TableDescriptor.java       | 14 ++++++++
 .../hbase/client/TableDescriptorBuilder.java       | 21 ++++++++++++
 .../hbase/snapshot/TestSecureExportSnapshot.java   |  2 +-
 .../hadoop/hbase/ipc/SimpleRpcScheduler.java       | 33 +++++++++++++++---
 .../MasterAnnotationReadingPriorityFunction.java   | 11 +++---
 .../hadoop/hbase/master/RegionsRecoveryChore.java  |  2 +-
 .../hadoop/hbase/master/SplitWALManager.java       |  2 +-
 .../hadoop/hbase/master/TableStateManager.java     |  2 +-
 .../hbase/master/assignment/AssignmentManager.java |  9 +++++
 .../hbase/master/balancer/SimpleLoadBalancer.java  |  2 +-
 .../master/procedure/MasterProcedureUtil.java      |  4 ++-
 .../master/procedure/ServerCrashProcedure.java     | 16 +++++----
 .../apache/hadoop/hbase/regionserver/HRegion.java  | 12 ++++---
 .../hadoop/hbase/regionserver/HRegionServer.java   | 40 ++++++++++++++--------
 .../apache/hadoop/hbase/regionserver/HStore.java   |  2 +-
 .../hadoop/hbase/regionserver/MemStoreFlusher.java |  3 +-
 .../hadoop/hbase/regionserver/RSRpcServices.java   |  8 ++---
 .../hbase/regionserver/RegionSplitPolicy.java      |  4 ++-
 .../regionserver/StorefileRefresherChore.java      |  3 +-
 .../wal/BoundedRecoveredHFilesOutputSink.java      |  2 +-
 26 files changed, 173 insertions(+), 57 deletions(-)


[hbase] 03/04: made reportRegionStateTransition retry delays a bit smarter

Posted by to...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

toffer pushed a commit to branch HBASE-11288.branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit c09fb1cf51207926621d71d4ca5d5d875af7778a
Author: Francis Liu <to...@apache.org>
AuthorDate: Sat Aug 8 14:31:41 2020 -0700

    made reportRegionStateTransition retry delays a bit smarter
---
 .../java/org/apache/hadoop/hbase/regionserver/HRegionServer.java    | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
index 64deba5..af5c487 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
@@ -2385,6 +2385,7 @@ public class HRegionServer extends Thread implements
     // Time to pause if master says 'please hold'. Make configurable if needed.
     final long initPauseTime = 1000;
     int tries = 0;
+    int pausedTries = 0;
     long pauseTime;
     // Keep looping till we get an error. We want to send reports even though server is going down.
     // Only go down if clusterConnection is null. It is set to null almost as last thing as the
@@ -2416,12 +2417,15 @@ public class HRegionServer extends Thread implements
                 || ioe instanceof CallQueueTooBigException;
         if (pause) {
           // Do backoff else we flood the Master with requests.
-          pauseTime = ConnectionUtils.getPauseTime(initPauseTime, tries);
+          pauseTime = ConnectionUtils.getPauseTime(initPauseTime, pausedTries);
+          pausedTries++;
         } else {
           pauseTime = initPauseTime; // Reset.
+          pausedTries = 0;
         }
         LOG.info("Failed report transition " +
           TextFormat.shortDebugString(request) + "; retry (#" + tries + ")" +
+            "; paused retry (#" + pausedTries + ")" +
             (pause?
                 " after " + pauseTime + "ms delay (Master is coming online...).":
                 " immediately."),


[hbase] 04/04: added root priority and executor on master

Posted by to...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

toffer pushed a commit to branch HBASE-11288.branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit 075bea4d8fa4d7c2c3465811a0b50841a6534fb3
Author: Francis Liu <to...@apache.org>
AuthorDate: Sun Aug 9 15:20:10 2020 -0700

    added root priority and executor on master
---
 .../hadoop/hbase/ipc/SimpleRpcScheduler.java       | 33 +++++++++++++++++++---
 .../MasterAnnotationReadingPriorityFunction.java   | 11 +++++---
 2 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.java
index 0c3e6c2..b424099 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.java
@@ -43,6 +43,11 @@ public class SimpleRpcScheduler extends RpcScheduler implements ConfigurationObs
   private final RpcExecutor replicationExecutor;
 
   /**
+   * Executor for root region only.
+   */
+  private final RpcExecutor rootTransitionExecutor;
+
+  /**
    * This executor is only for meta transition
    */
   private final RpcExecutor metaTransitionExecutor;
@@ -122,6 +127,9 @@ public class SimpleRpcScheduler extends RpcScheduler implements ConfigurationObs
             RpcExecutor.CALL_QUEUE_TYPE_FIFO_CONF_VALUE, maxPriorityQueueLength, priority, conf,
             abortable) :
         null;
+    this.rootTransitionExecutor = new FastPathBalancedQueueRpcExecutor("rootPriority.FPBQ", 1,
+        RpcExecutor.CALL_QUEUE_TYPE_FIFO_CONF_VALUE, maxPriorityQueueLength, priority, conf,
+        abortable);
   }
 
   public SimpleRpcScheduler(Configuration conf, int handlerCount, int priorityHandlerCount,
@@ -143,6 +151,9 @@ public class SimpleRpcScheduler extends RpcScheduler implements ConfigurationObs
     if (replicationExecutor != null) {
       replicationExecutor.resizeQueues(conf);
     }
+    if (rootTransitionExecutor != null) {
+      rootTransitionExecutor.resizeQueues(conf);
+    }
     if (metaTransitionExecutor != null) {
       metaTransitionExecutor.resizeQueues(conf);
     }
@@ -168,10 +179,12 @@ public class SimpleRpcScheduler extends RpcScheduler implements ConfigurationObs
     if (replicationExecutor != null) {
       replicationExecutor.start(port);
     }
+    if (rootTransitionExecutor != null) {
+      rootTransitionExecutor.start(port);
+    }
     if (metaTransitionExecutor != null) {
       metaTransitionExecutor.start(port);
     }
-
   }
 
   @Override
@@ -186,7 +199,9 @@ public class SimpleRpcScheduler extends RpcScheduler implements ConfigurationObs
     if (metaTransitionExecutor != null) {
       metaTransitionExecutor.stop();
     }
-
+    if (rootTransitionExecutor != null) {
+      rootTransitionExecutor.stop();
+    }
   }
 
   @Override
@@ -197,7 +212,10 @@ public class SimpleRpcScheduler extends RpcScheduler implements ConfigurationObs
     if (level == HConstants.PRIORITY_UNSET) {
       level = HConstants.NORMAL_QOS;
     }
-    if (metaTransitionExecutor != null &&
+    if (rootTransitionExecutor != null &&
+      level == MasterAnnotationReadingPriorityFunction.ROOT_TRANSITION_QOS) {
+      return rootTransitionExecutor.dispatch(callTask);
+    } else if (metaTransitionExecutor != null &&
       level == MasterAnnotationReadingPriorityFunction.META_TRANSITION_QOS) {
       return metaTransitionExecutor.dispatch(callTask);
     } else if (priorityExecutor != null && level > highPriorityLevel) {
@@ -208,7 +226,7 @@ public class SimpleRpcScheduler extends RpcScheduler implements ConfigurationObs
       return callExecutor.dispatch(callTask);
     }
   }
-
+  
   @Override
   public int getMetaPriorityQueueLength() {
     return metaTransitionExecutor == null ? 0 : metaTransitionExecutor.getQueueLength();
@@ -326,6 +344,13 @@ public class SimpleRpcScheduler extends RpcScheduler implements ConfigurationObs
       callQueueInfo.setCallMethodSize(queueName, metaTransitionExecutor.getCallQueueSizeSummary());
     }
 
+    if (null != rootTransitionExecutor) {
+      queueName = "ROOT Transition Queue";
+      callQueueInfo.setCallMethodCount(queueName,
+        rootTransitionExecutor.getCallQueueCountsSummary());
+      callQueueInfo.setCallMethodSize(queueName, rootTransitionExecutor.getCallQueueSizeSummary());
+    }
+
     return callQueueInfo;
   }
 
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterAnnotationReadingPriorityFunction.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterAnnotationReadingPriorityFunction.java
index 87f345e..3a6cb5b 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterAnnotationReadingPriorityFunction.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterAnnotationReadingPriorityFunction.java
@@ -50,7 +50,8 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProto
 @InterfaceAudience.Private
 public class MasterAnnotationReadingPriorityFunction extends AnnotationReadingPriorityFunction {
 
-  public static final int META_TRANSITION_QOS = 300;
+  public static final int ROOT_TRANSITION_QOS = 300;
+  public static final int META_TRANSITION_QOS = 299;
 
   public MasterAnnotationReadingPriorityFunction(final RSRpcServices rpcServices) {
     this(rpcServices, rpcServices.getClass());
@@ -69,7 +70,7 @@ public class MasterAnnotationReadingPriorityFunction extends AnnotationReadingPr
     // every single RPC request.
     int priorityByAnnotation = getAnnotatedPriority(header);
     if (priorityByAnnotation >= 0) {
-      // no one can have higher priority than meta transition.
+      // No one can have higher priority than ROOT and META transition.
       if (priorityByAnnotation >= META_TRANSITION_QOS) {
         return META_TRANSITION_QOS - 1;
       } else {
@@ -77,7 +78,7 @@ public class MasterAnnotationReadingPriorityFunction extends AnnotationReadingPr
       }
     }
 
-    // If meta is moving then all the other of reports of state transitions will be
+    // If ROOT or meta are moving then all the other of reports of state transitions will be
     // un able to edit meta. Those blocked reports should not keep the report that opens meta from
     // running. Hence all reports of meta transition should always be in a different thread.
     // This keeps from deadlocking the cluster.
@@ -89,7 +90,9 @@ public class MasterAnnotationReadingPriorityFunction extends AnnotationReadingPr
         if (rst.getRegionInfoList() != null) {
           for (HBaseProtos.RegionInfo info : rst.getRegionInfoList()) {
             TableName tn = ProtobufUtil.toTableName(info.getTableName());
-            if (TableName.META_TABLE_NAME.equals(tn)) {
+            if (TableName.ROOT_TABLE_NAME.equals(tn)) {
+              return ROOT_TRANSITION_QOS;
+            } else if (TableName.META_TABLE_NAME.equals(tn)) {
               return META_TRANSITION_QOS;
             }
           }


[hbase] 01/04: Some extra fixes as precaution

Posted by to...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

toffer pushed a commit to branch HBASE-11288.branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit 87e2bb70b680f13e2eddb402f3ed98eeef2cfcb5
Author: Francis Liu <to...@apache.org>
AuthorDate: Fri Aug 7 02:09:51 2020 -0700

    Some extra fixes as precaution
---
 .../org/apache/hadoop/hbase/HTableDescriptor.java  |  6 +++-
 .../hadoop/hbase/client/AsyncClientScanner.java    |  4 +--
 .../hbase/client/ConnectionImplementation.java     |  8 ++++-
 .../org/apache/hadoop/hbase/client/HBaseAdmin.java |  4 ++-
 .../apache/hadoop/hbase/client/MasterCallable.java |  8 +++++
 .../hadoop/hbase/client/RawAsyncHBaseAdmin.java    |  8 ++---
 .../hadoop/hbase/client/TableDescriptor.java       | 14 +++++++++
 .../hbase/client/TableDescriptorBuilder.java       | 21 +++++++++++++
 .../hbase/snapshot/TestSecureExportSnapshot.java   |  2 +-
 .../hadoop/hbase/master/RegionsRecoveryChore.java  |  2 +-
 .../hadoop/hbase/master/SplitWALManager.java       |  2 +-
 .../hadoop/hbase/master/TableStateManager.java     |  2 +-
 .../hbase/master/assignment/AssignmentManager.java |  9 ++++++
 .../hbase/master/balancer/SimpleLoadBalancer.java  |  2 +-
 .../master/procedure/MasterProcedureUtil.java      |  4 ++-
 .../master/procedure/ServerCrashProcedure.java     |  6 +++-
 .../apache/hadoop/hbase/regionserver/HRegion.java  | 12 +++++---
 .../hadoop/hbase/regionserver/HRegionServer.java   | 34 +++++++++++++---------
 .../apache/hadoop/hbase/regionserver/HStore.java   |  2 +-
 .../hadoop/hbase/regionserver/MemStoreFlusher.java |  3 +-
 .../hadoop/hbase/regionserver/RSRpcServices.java   |  8 ++---
 .../hbase/regionserver/RegionSplitPolicy.java      |  4 ++-
 .../regionserver/StorefileRefresherChore.java      |  3 +-
 .../wal/BoundedRecoveredHFilesOutputSink.java      |  2 +-
 24 files changed, 128 insertions(+), 42 deletions(-)

diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java
index 77d2b47..3f30af3 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java
@@ -131,7 +131,11 @@ public class HTableDescriptor implements TableDescriptor, Comparable<HTableDescr
    * @return always return the false
    */
   public boolean isRootRegion() {
-    return false;
+    return delegatee.isRootRegion();
+  }
+
+  public boolean isRootTable() {
+    return delegatee.isRootTable();
   }
 
   /**
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncClientScanner.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncClientScanner.java
index 5fd00a5..8664d56 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncClientScanner.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncClientScanner.java
@@ -195,8 +195,8 @@ class AsyncClientScanner {
   }
 
   private long getPrimaryTimeoutNs() {
-    return TableName.isMetaTableName(tableName) ? conn.connConf.getPrimaryMetaScanTimeoutNs()
-      : conn.connConf.getPrimaryScanTimeoutNs();
+    return TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName) ?
+      conn.connConf.getPrimaryMetaScanTimeoutNs() : conn.connConf.getPrimaryScanTimeoutNs();
   }
 
   private void openScanner() {
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java
index 21cedfe..0a525c9 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionImplementation.java
@@ -661,6 +661,10 @@ class ConnectionImplementation implements ClusterConnection, Closeable {
         LOG.debug("Table {} not enabled", tableName);
         return false;
       }
+      if (TableName.isRootTableName(tableName)) {
+        // meta table is always available
+        return true;
+      }
       if (TableName.isMetaTableName(tableName)) {
         // meta table is always available
         return true;
@@ -735,7 +739,9 @@ class ConnectionImplementation implements ClusterConnection, Closeable {
   public List<HRegionLocation> locateRegions(TableName tableName, boolean useCache,
       boolean offlined) throws IOException {
     List<RegionInfo> regions;
-    if (TableName.isMetaTableName(tableName)) {
+    if (TableName.isRootTableName(tableName)) {
+      regions = Collections.singletonList(RegionInfoBuilder.ROOT_REGIONINFO);
+    } else  if (TableName.isMetaTableName(tableName)) {
       regions = Collections.singletonList(RegionInfoBuilder.FIRST_META_REGIONINFO);
     } else {
       regions = MetaTableAccessor.getTableRegions(this, tableName, !offlined);
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
index 4b1a738..c06d275 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
@@ -424,7 +424,9 @@ public class HBaseAdmin implements Admin {
 
   @Override
   public List<RegionInfo> getRegions(TableName tableName) throws IOException {
-    if (TableName.isMetaTableName(tableName)) {
+    if (TableName.isRootTableName(tableName)) {
+      return Arrays.asList(RegionInfoBuilder.ROOT_REGIONINFO);
+    } else if (TableName.isMetaTableName(tableName)) {
       return Arrays.asList(RegionInfoBuilder.FIRST_META_REGIONINFO);
     } else {
       return MetaTableAccessor.getTableRegions(connection, tableName, true);
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java
index 7ae9731..1089573 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterCallable.java
@@ -132,11 +132,19 @@ abstract class MasterCallable<V> implements RetryingCallable<V>, Closeable {
    * @param regionName RegionName. If hbase:meta, we'll set high priority.
    */
   void setPriority(final byte[] regionName) {
+    if (isRootRegion(regionName)) {
+      setPriority(TableName.ROOT_TABLE_NAME);
+    }
     if (isMetaRegion(regionName)) {
       setPriority(TableName.META_TABLE_NAME);
     }
   }
 
+  private static boolean isRootRegion(final byte[] regionName) {
+    return Bytes.equals(regionName, RegionInfoBuilder.ROOT_REGIONINFO.getRegionName()) ||
+      Bytes.equals(regionName, RegionInfoBuilder.ROOT_REGIONINFO.getEncodedNameAsBytes());
+  }
+
   private static boolean isMetaRegion(final byte[] regionName) {
     return Bytes.equals(regionName, RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName()) ||
       Bytes.equals(regionName, RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedNameAsBytes());
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
index 1091ef6..cba6b18 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
@@ -480,7 +480,7 @@ class RawAsyncHBaseAdmin implements AsyncAdmin {
 
   @Override
   public CompletableFuture<Boolean> tableExists(TableName tableName) {
-    if (TableName.isMetaTableName(tableName)) {
+    if (TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName)) {
       return CompletableFuture.completedFuture(true);
     }
     return AsyncMetaTableAccessor.tableExists(metaTable, tableName);
@@ -692,7 +692,7 @@ class RawAsyncHBaseAdmin implements AsyncAdmin {
 
   @Override
   public CompletableFuture<Boolean> isTableEnabled(TableName tableName) {
-    if (TableName.isMetaTableName(tableName)) {
+    if (TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName)) {
       return CompletableFuture.completedFuture(true);
     }
     CompletableFuture<Boolean> future = new CompletableFuture<>();
@@ -705,7 +705,7 @@ class RawAsyncHBaseAdmin implements AsyncAdmin {
 
   @Override
   public CompletableFuture<Boolean> isTableDisabled(TableName tableName) {
-    if (TableName.isMetaTableName(tableName)) {
+    if (TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName)) {
       return CompletableFuture.completedFuture(false);
     }
     CompletableFuture<Boolean> future = new CompletableFuture<>();
@@ -730,7 +730,7 @@ class RawAsyncHBaseAdmin implements AsyncAdmin {
 
   private CompletableFuture<Boolean> isTableAvailable(TableName tableName,
       Optional<byte[][]> splitKeys) {
-    if (TableName.isMetaTableName(tableName)) {
+    if (TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName)) {
       return connection.registry.getMetaRegionLocations().thenApply(locs -> Stream
         .of(locs.getRegionLocations()).allMatch(loc -> loc != null && loc.getServerName() != null));
     }
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptor.java
index 2ae273d..a97b394 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptor.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptor.java
@@ -278,6 +278,20 @@ public interface TableDescriptor {
    *
    * @return true if this table is <code> hbase:meta </code> region
    */
+  boolean isRootRegion();
+
+  /**
+   * Checks if the table is a <code>hbase:meta</code> table
+   *
+   * @return true if table is <code> hbase:meta </code> region.
+   */
+  boolean isRootTable();
+
+  /**
+   * Checks if this table is <code> hbase:meta </code> region.
+   *
+   * @return true if this table is <code> hbase:meta </code> region
+   */
   boolean isMetaRegion();
 
   /**
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptorBuilder.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptorBuilder.java
index d35dd2c..b98c02a 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptorBuilder.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/TableDescriptorBuilder.java
@@ -642,6 +642,27 @@ public class TableDescriptorBuilder {
      * @return true if this table is <code> hbase:meta </code> region
      */
     @Override
+    public boolean isRootRegion() {
+      //TODO should we add a IS_ROOT key or rename/keep IS_META to mean IS_CATALOG
+      return getTableName().equals(TableName.ROOT_TABLE_NAME);
+    }
+
+    /**
+     * Checks if the table is a <code>hbase:meta</code> table
+     *
+     * @return true if table is <code> hbase:meta </code> region.
+     */
+    @Override
+    public boolean isRootTable() {
+      return isRootRegion();
+    }
+
+    /**
+     * Checks if this table is <code> hbase:meta </code> region.
+     *
+     * @return true if this table is <code> hbase:meta </code> region
+     */
+    @Override
     public boolean isMetaRegion() {
       return getOrDefault(IS_META_KEY, Boolean::valueOf, false);
     }
diff --git a/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.java
index 133934d..4bb45a0 100644
--- a/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.java
@@ -32,7 +32,7 @@ import org.junit.experimental.categories.Category;
 /**
  * Reruns TestExportSnapshot using ExportSnapshot in secure mode.
  */
-@Ignore
+//@Ignore
 @Category({VerySlowRegionServerTests.class, LargeTests.class})
 public class TestSecureExportSnapshot extends TestExportSnapshot {
 
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java
index 0ee5a1b..e6baecd 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionsRecoveryChore.java
@@ -155,7 +155,7 @@ public class RegionsRecoveryChore extends ScheduledChore {
 
     final RegionInfo regionInfo = hMaster.getAssignmentManager().getRegionInfo(regionName);
     final TableName tableName = regionInfo.getTable();
-    if (TableName.isMetaTableName(tableName)) {
+    if (TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName)) {
       // Do not reopen regions of meta table even if it has
       // high store file reference count
       return;
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/SplitWALManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/SplitWALManager.java
index 5ef25a1..fbd0fed 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/SplitWALManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/SplitWALManager.java
@@ -115,7 +115,7 @@ public class SplitWALManager {
     return splitWALs(crashedServer, SplitType.USER);
   }
 
-  public List<Procedure> splitWALs(ServerName crashedServer, SplitType splitType)
+  public List<Procedure>  splitWALs(ServerName crashedServer, SplitType splitType)
       throws IOException {
     try {
       // 1. list all splitting files
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableStateManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableStateManager.java
index 4360e74..1e7f1a9 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableStateManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableStateManager.java
@@ -221,7 +221,7 @@ public class TableStateManager {
     });
     for (TableDescriptor tableDesc : tableDescriptors.getAll().values()) {
       TableName tableName = tableDesc.getTableName();
-      if (TableName.isMetaTableName(tableName)) {
+      if (TableName.isRootTableName(tableName) || TableName.isMetaTableName(tableName)) {
         // This table is always enabled. No fixup needed. No entry in hbase:meta needed.
         // Call through to fixTableState though in case a super class wants to do something.
         fixTableState(new TableState(tableName, TableState.State.ENABLED));
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
index 2881f83..79d7b64 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java
@@ -918,6 +918,15 @@ public class AssignmentManager {
 
   @VisibleForTesting
   static int compare(TransitRegionStateProcedure left, TransitRegionStateProcedure right) {
+    //TODO this is broken once we have more meta entries
+    if (left.getRegion().isRootRegion()) {
+      if (right.getRegion().isRootRegion()) {
+        return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());
+      }
+      return -1;
+    } else if (right.getRegion().isRootRegion()) {
+      return +1;
+    }
     if (left.getRegion().isMetaRegion()) {
       if (right.getRegion().isMetaRegion()) {
         return RegionInfo.COMPARATOR.compare(left.getRegion(), right.getRegion());
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java
index d8b4256..9c58207 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java
@@ -396,7 +396,7 @@ public class SimpleLoadBalancer extends BaseLoadBalancer {
           balanceInfo == null ? 0 : balanceInfo.getNextRegionForUnload();
         if (idx >= server.getValue().size()) break;
         RegionInfo region = server.getValue().get(idx);
-        if (region.isMetaRegion()) continue; // Don't move meta regions.
+        if (region.isRootRegion() || region.isMetaRegion()) continue; // Don't move meta regions.
         regionsToMove.add(new RegionPlan(region, server.getKey().getServerName(), null));
         balanceInfo.setNumRegionsAdded(balanceInfo.getNumRegionsAdded() - 1);
         balanceInfo.setNextRegionForUnload(balanceInfo.getNextRegionForUnload() + 1);
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java
index efe3d83..2f68f21 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.java
@@ -166,7 +166,9 @@ public final class MasterProcedureUtil {
    * user tables are 1.
    */
   public static int getTablePriority(TableName tableName) {
-    if (TableName.isMetaTableName(tableName)) {
+    if (TableName.isRootTableName(tableName)) {
+      return 4;
+    } else if (TableName.isMetaTableName(tableName)) {
       return 3;
     } else if (tableName.isSystemTable()) {
       return 2;
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java
index 9ced487..5393fd0 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java
@@ -350,10 +350,14 @@ public class ServerCrashProcedure
     if (regionsOnCrashedServer == null) {
       return false;
     }
-    regionsOnCrashedServer.removeIf(this::isDefaultMetaRegion);
+    regionsOnCrashedServer.removeIf((x) -> isDefaultMetaRegion(x) || isDefaultRootRegion(x));
     return !regionsOnCrashedServer.isEmpty();
   }
 
+  private boolean isDefaultRootRegion(RegionInfo hri) {
+    return hri.isRootRegion() && RegionReplicaUtil.isDefaultReplica(hri);
+  }
+
   private boolean isDefaultMetaRegion(RegionInfo hri) {
     return hri.isMetaRegion() && RegionReplicaUtil.isDefaultReplica(hri);
   }
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
index fef1fa5..87d9c09 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
@@ -778,7 +778,8 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
     this.cellComparator = htd.isMetaTable() ||
       conf.getBoolean(USE_META_CELL_COMPARATOR, DEFAULT_USE_META_CELL_COMPARATOR) ?
         CellComparatorImpl.META_COMPARATOR :
-        CellComparatorImpl.COMPARATOR;
+          htd.isRootTable() ? CellComparatorImpl.ROOT_COMPARATOR : CellComparatorImpl.COMPARATOR;
+
     this.lock = new ReentrantReadWriteLock(conf.getBoolean(FAIR_REENTRANT_CLOSE_LOCK,
         DEFAULT_FAIR_REENTRANT_CLOSE_LOCK));
     this.flushCheckInterval = conf.getInt(MEMSTORE_PERIODIC_FLUSH_INTERVAL,
@@ -4542,7 +4543,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
   */
   void checkResources() throws RegionTooBusyException {
     // If catalog region, do not impose resource constraints or block updates.
-    if (this.getRegionInfo().isMetaRegion()) return;
+    if (this.getRegionInfo().isRootRegion() || this.getRegionInfo().isMetaRegion()) return;
 
     MemStoreSize mss = this.memStoreSizing.getMemStoreSize();
     if (mss.getHeapSize() + mss.getOffHeapSize() > this.blockingMemStoreSize) {
@@ -8514,7 +8515,9 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
    */
   public Optional<byte[]> checkSplit(boolean force) {
     // Can't split META
-    if (this.getRegionInfo().isMetaRegion() ||
+    if (
+      this.getRegionInfo().isRootRegion() ||
+      this.getRegionInfo().isMetaRegion() ||
       TableName.NAMESPACE_TABLE_NAME.equals(this.getRegionInfo().getTable())) {
       return Optional.empty();
     }
@@ -8717,7 +8720,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
    * @throws IOException If anything goes wrong with DFS
    */
   private void sync(long txid, Durability durability) throws IOException {
-    if (this.getRegionInfo().isMetaRegion()) {
+    if (this.getRegionInfo().isRootRegion() || this.getRegionInfo().isMetaRegion()) {
       this.wal.sync(txid);
     } else {
       switch(durability) {
@@ -8881,6 +8884,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
     StringBuilder buf = new StringBuilder();
     buf.append(title + ", ");
     buf.append(getRegionInfo().toString());
+    buf.append(getRegionInfo().isRootRegion() ? " root region " : " ");
     buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");
     buf.append("stores: ");
     for (HStore s : stores.values()) {
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
index 00ba4c0..64deba5 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
@@ -119,7 +119,6 @@ import org.apache.hadoop.hbase.ipc.ServerRpcController;
 import org.apache.hadoop.hbase.log.HBaseMarkers;
 import org.apache.hadoop.hbase.master.HMaster;
 import org.apache.hadoop.hbase.master.LoadBalancer;
-import org.apache.hadoop.hbase.master.RegionState.State;
 import org.apache.hadoop.hbase.master.RegionState;
 import org.apache.hadoop.hbase.mob.MobFileCache;
 import org.apache.hadoop.hbase.procedure.RegionServerProcedureManagerHost;
@@ -136,6 +135,7 @@ import org.apache.hadoop.hbase.regionserver.compactions.CompactionProgress;
 import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequester;
 import org.apache.hadoop.hbase.regionserver.handler.CloseMetaHandler;
 import org.apache.hadoop.hbase.regionserver.handler.CloseRegionHandler;
+import org.apache.hadoop.hbase.regionserver.handler.CloseRootHandler;
 import org.apache.hadoop.hbase.regionserver.handler.RSProcedureHandler;
 import org.apache.hadoop.hbase.regionserver.handler.RegionReplicaFlushHandler;
 import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;
@@ -160,7 +160,6 @@ import org.apache.hadoop.hbase.util.CompressionTest;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 import org.apache.hadoop.hbase.util.FSTableDescriptors;
 import org.apache.hadoop.hbase.util.FSUtils;
-import org.apache.hadoop.hbase.util.FutureUtils;
 import org.apache.hadoop.hbase.util.JvmPauseMonitor;
 import org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig;
 import org.apache.hadoop.hbase.util.Pair;
@@ -1118,13 +1117,13 @@ public class HRegionServer extends Thread implements
     }
 
     // Closing the compactSplit thread before closing meta regions
-    if (!this.killed && containsMetaTableRegions()) {
+    if (!this.killed && containsCatalogTableRegions()) {
       if (!abortRequested.get() || this.dataFsOk) {
         if (this.compactSplitThread != null) {
           this.compactSplitThread.join();
           this.compactSplitThread = null;
         }
-        closeMetaTableRegions(abortRequested.get());
+        closeCatalogTableRegions(abortRequested.get());
       }
     }
 
@@ -1190,16 +1189,17 @@ public class HRegionServer extends Thread implements
     LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed.");
   }
 
-  //TODO francis update this
-  private boolean containsMetaTableRegions() {
-    return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());
+  private boolean containsCatalogTableRegions() {
+    return onlineRegions.containsKey(RegionInfoBuilder.ROOT_REGIONINFO.getEncodedName()) ||
+      onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());
   }
 
   private boolean areAllUserRegionsOffline() {
     if (getNumberOfOnlineRegions() > 2) return false;
     boolean allUserRegionsOffline = true;
     for (Map.Entry<String, HRegion> e: this.onlineRegions.entrySet()) {
-      if (!e.getValue().getRegionInfo().isMetaRegion()) {
+      if (!e.getValue().getRegionInfo().isRootRegion() ||
+        !e.getValue().getRegionInfo().isMetaRegion()) {
         allUserRegionsOffline = false;
         break;
       }
@@ -2328,7 +2328,7 @@ public class HRegionServer extends Thread implements
 
     if (code == TransitionCode.OPENED) {
       Preconditions.checkArgument(hris != null && hris.length == 1);
-      if (hris[0].isMetaRegion()) {
+      if (hris[0].isRootRegion()) {
         try {
           MetaTableLocator.setMetaLocation(getZooKeeper(), serverName,
               hris[0].getReplicaId(), RegionState.State.OPEN);
@@ -2821,20 +2821,25 @@ public class HRegionServer extends Thread implements
    * Close meta region if we carry it
    * @param abort Whether we're running an abort.
    */
-  private void closeMetaTableRegions(final boolean abort) {
+  private void closeCatalogTableRegions(final boolean abort) {
+    HRegion root = null;
     HRegion meta = null;
     this.onlineRegionsLock.writeLock().lock();
     try {
       for (Map.Entry<String, HRegion> e: onlineRegions.entrySet()) {
         RegionInfo hri = e.getValue().getRegionInfo();
+        if (hri.isRootRegion()) {
+          root = e.getValue();
+        }
         if (hri.isMetaRegion()) {
           meta = e.getValue();
         }
-        if (meta != null) break;
+        if (root != null && meta != null) break;
       }
     } finally {
       this.onlineRegionsLock.writeLock().unlock();
     }
+    if (root != null) closeRegionIgnoreErrors(root.getRegionInfo(), abort);
     if (meta != null) closeRegionIgnoreErrors(meta.getRegionInfo(), abort);
   }
 
@@ -2849,7 +2854,8 @@ public class HRegionServer extends Thread implements
     try {
       for (Map.Entry<String, HRegion> e: this.onlineRegions.entrySet()) {
         HRegion r = e.getValue();
-        if (!r.getRegionInfo().isMetaRegion() && r.isAvailable()) {
+        if (!r.getRegionInfo().isRootRegion() && !r.getRegionInfo().isMetaRegion()
+          && r.isAvailable()) {
           // Don't update zk with this close transition; pass false.
           closeRegionIgnoreErrors(r.getRegionInfo(), abort);
         }
@@ -3294,7 +3300,9 @@ public class HRegionServer extends Thread implements
 
     CloseRegionHandler crh;
     final RegionInfo hri = actualRegion.getRegionInfo();
-    if (hri.isMetaRegion()) {
+    if (hri.isRootRegion()) {
+      crh = new CloseRootHandler(this, this, hri, abort);
+    } else if (hri.isMetaRegion()) {
       crh = new CloseMetaHandler(this, this, hri, abort);
     } else {
       crh = new CloseRegionHandler(this, this, hri, abort, destination);
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
index 4e3c5ba..bb893fd 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
@@ -2130,7 +2130,7 @@ public class HStore implements Store, HeapSize, StoreConfigInformation,
     this.lock.readLock().lock();
     try {
       // Should already be enforced by the split policy!
-      assert !this.getRegionInfo().isMetaRegion();
+      assert !this.getRegionInfo().isRootRegion() && !this.getRegionInfo().isMetaRegion();
       // Not split-able if we find a reference store file present in the store.
       if (hasReferences()) {
         LOG.trace("Not splittable; has references: {}", this);
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java
index 1537f7c..f2a1779 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java
@@ -548,7 +548,8 @@ class MemStoreFlusher implements FlushRequester {
    */
   private boolean flushRegion(final FlushRegionEntry fqe) {
     HRegion region = fqe.region;
-    if (!region.getRegionInfo().isMetaRegion() && isTooManyStoreFiles(region)) {
+    if (!region.getRegionInfo().isRootRegion() && !region.getRegionInfo().isMetaRegion()
+      && isTooManyStoreFiles(region)) {
       if (fqe.isMaximumWait(this.blockingWaitTime)) {
         LOG.info("Waited " + (EnvironmentEdgeManager.currentTime() - fqe.createTime) +
           "ms on a compaction to clean up 'too many store files'; waited " +
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
index f15c662..9c3349f 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
@@ -641,7 +641,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler,
     throws IOException {
     int countOfCompleteMutation = 0;
     try {
-      if (!region.getRegionInfo().isMetaRegion()) {
+      if (!region.getRegionInfo().isRootRegion() && !region.getRegionInfo().isMetaRegion()) {
         regionServer.getMemStoreFlusher().reclaimMemStoreMemory();
       }
       RowMutations rm = null;
@@ -1080,7 +1080,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler,
         quota.addMutation(mutation);
       }
 
-      if (!region.getRegionInfo().isMetaRegion()) {
+      if (!region.getRegionInfo().isRootRegion() && !region.getRegionInfo().isMetaRegion()) {
         regionServer.getMemStoreFlusher().reclaimMemStoreMemory();
       }
 
@@ -1211,7 +1211,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler,
         }
       }
       requestCount.increment();
-      if (!region.getRegionInfo().isMetaRegion()) {
+      if (!region.getRegionInfo().isRootRegion() && !region.getRegionInfo().isMetaRegion()) {
         regionServer.getMemStoreFlusher().reclaimMemStoreMemory();
       }
       return region.batchReplay(mutations.toArray(
@@ -3059,7 +3059,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler,
       region = getRegion(request.getRegion());
       MutateResponse.Builder builder = MutateResponse.newBuilder();
       MutationProto mutation = request.getMutation();
-      if (!region.getRegionInfo().isMetaRegion()) {
+      if (!region.getRegionInfo().isRootRegion() && !region.getRegionInfo().isMetaRegion()) {
         regionServer.getMemStoreFlusher().reclaimMemStoreMemory();
       }
       long nonceGroup = request.hasNonceGroup() ? request.getNonceGroup() : HConstants.NO_NONCE;
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.java
index 3079925..8165f88 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.java
@@ -75,7 +75,9 @@ public abstract class RegionSplitPolicy extends Configured {
    * @return {@code true} if the specified region can be split.
    */
   protected boolean canSplit() {
-    return !region.getRegionInfo().isMetaRegion() && region.isAvailable() &&
+    return !region.getRegionInfo().isRootRegion() &&
+      !region.getRegionInfo().isMetaRegion() &&
+      region.isAvailable() &&
       !TableName.NAMESPACE_TABLE_NAME.equals(region.getRegionInfo().getTable()) &&
       region.getStores().stream().allMatch(HStore::canSplit);
   }
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java
index 18f7e18..394d86a 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java
@@ -91,7 +91,8 @@ public class StorefileRefresherChore extends ScheduledChore {
       }
       // don't refresh unless enabled for all files, or it the meta region
       // meta region don't have WAL replication for replicas enabled yet
-      if (onlyMetaRefresh && !r.getRegionInfo().isMetaRegion()) continue;
+      if (onlyMetaRefresh &&
+        !r.getRegionInfo().isRootRegion() && !r.getRegionInfo().isMetaRegion()) continue;
       String encodedName = r.getRegionInfo().getEncodedName();
       long time = EnvironmentEdgeManager.currentTime();
       if (!lastRefreshTimes.containsKey(encodedName)) {
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/BoundedRecoveredHFilesOutputSink.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/BoundedRecoveredHFilesOutputSink.java
index d1be4fb..ad7387e 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/BoundedRecoveredHFilesOutputSink.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/BoundedRecoveredHFilesOutputSink.java
@@ -203,7 +203,7 @@ public class BoundedRecoveredHFilesOutputSink extends OutputSink {
     HFileContext hFileContext = new HFileContextBuilder().
       withChecksumType(HStore.getChecksumType(walSplitter.conf)).
       withBytesPerCheckSum(HStore.getBytesPerChecksum(walSplitter.conf)).
-      withCellComparator(isMetaTable?
+      withCellComparator(isRootTable? CellComparatorImpl.ROOT_COMPARATOR : isMetaTable?
         CellComparatorImpl.META_COMPARATOR: CellComparatorImpl.COMPARATOR).build();
     return writerBuilder.withFileContext(hFileContext).build();
   }


[hbase] 02/04: missing states requirining waiting for root loaded

Posted by to...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

toffer pushed a commit to branch HBASE-11288.branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit deeb817a47d86b3a8de82c88dbcc4ebc867cb46a
Author: Francis Liu <to...@apache.org>
AuthorDate: Sat Aug 8 00:42:56 2020 -0700

    missing states requirining waiting for root loaded
---
 .../hadoop/hbase/master/procedure/ServerCrashProcedure.java    | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java
index 5393fd0..8e231ad 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java
@@ -145,7 +145,11 @@ public class ServerCrashProcedure
       case SERVER_CRASH_ASSIGN_ROOT:
         break;
 
+      //Don't block hbase:meta processing states on hbase:meta being loaded
       case SERVER_CRASH_CHECK_CARRYING_META:
+      case SERVER_CRASH_SPLIT_META_LOGS:
+      case SERVER_CRASH_DELETE_SPLIT_META_WALS_DIR:
+      case SERVER_CRASH_ASSIGN_META:
         // If hbase:root is not loaded, we can't do the check so yield
         if (env.getAssignmentManager().waitRootLoaded(this)) {
           LOG.info("pid="+getProcId()+", waiting for root loaded: "+state+
@@ -154,12 +158,6 @@ public class ServerCrashProcedure
         }
         break;
 
-      //Don't block hbase:meta processing states on hbase:meta being loaded
-      case SERVER_CRASH_SPLIT_META_LOGS:
-      case SERVER_CRASH_DELETE_SPLIT_META_WALS_DIR:
-      case SERVER_CRASH_ASSIGN_META:
-        break;
-
       default:
         // If hbase:meta is not assigned, yield.
         if (env.getAssignmentManager().waitMetaLoaded(this)) {