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 fb782569cff..33e896c9c5b 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 @@ -161,6 +161,9 @@ public interface TableDescriptor { */ long getMemStoreFlushSize(); + // TODO: Currently this is used RPC scheduling only. Make it more generic than this; allow it + // to also be priority when scheduling procedures that pertain to this table scheduling first + // those tables with the highest priority (From Yi Liang over on HBASE-18109). int getPriority(); /** 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 c10111f107e..a7fb743e205 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 @@ -1169,7 +1169,7 @@ public class AssignmentManager implements ServerListener { // assign offline regions st = System.currentTimeMillis(); - for (HRegionInfo regionInfo: regionsToAssign) { + for (HRegionInfo regionInfo: getOrderedRegions(regionsToAssign)) { master.getMasterProcedureExecutor().submitProcedure( createAssignProcedure(regionInfo, false)); } @@ -1277,6 +1277,27 @@ public class AssignmentManager implements ServerListener { return new Pair(ritCount, states.size()); } + /** + * Used when assign regions, this method will put system regions in + * front of user regions + * @param regions + * @return A list of regions with system regions at front + */ + public List getOrderedRegions( + final List regions) { + if (regions == null) return Collections.emptyList(); + + List systemList = new ArrayList<>(); + List userList = new ArrayList<>(); + for (HRegionInfo hri : regions) { + if (hri.isSystemTable()) systemList.add(hri); + else userList.add(hri); + } + // Append userList to systemList + systemList.addAll(userList); + return systemList; + } + // ============================================================================================ // TODO: Region State In Transition // ============================================================================================ diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java index 14107482e3d..575fa809ea3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java @@ -121,7 +121,9 @@ public class MasterProcedureScheduler extends AbstractProcedureScheduler { /** * Table priority is used when scheduling procedures from {@link #tableRunQueue}. A TableQueue * with priority 2 will get its procedures scheduled at twice the rate as compared to - * TableQueue with priority 1. + * TableQueue with priority 1. This should be enough to ensure system/meta get assigned out + * before user-space tables. HBASE-18109 is where we conclude what is here is good enough. + * Lets open new issue if we find it not enough. */ private static class TablePriorities { final int metaTablePriority; 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 e0f0dbe64e7..c6cd861884a 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 @@ -186,8 +186,9 @@ implements ServerProcedureInterface { "; cycles=" + this.cycles); } handleRIT(env, regionsOnCrashedServer); - addChildProcedure(env.getAssignmentManager(). - createAssignProcedures(regionsOnCrashedServer, true)); + AssignmentManager am = env.getAssignmentManager(); + addChildProcedure(am. + createAssignProcedures(am.getOrderedRegions(regionsOnCrashedServer), true)); } setNextState(ServerCrashState.SERVER_CRASH_FINISH); break;