From 28405c3de5b976f975d36dd999260378e5047ec1 Mon Sep 17 00:00:00 2001 From: Josh Elser Date: Fri, 8 Jun 2018 11:52:29 -0400 Subject: [PATCH] HBASE-20706 Prevent MTP from pulling non-OPEN regions to reopen We know MTP is using MoveProc poorly, but this is a simple hack which will help prevent the cluster from getting stuck in a fast loop while holding the table's lock. Change-Id: Id0b62eb1fb9ecea4eb4aaf1160475637f32eb1ea --- .../hadoop/hbase/master/assignment/RegionStates.java | 19 +++++++++++++++++-- .../hbase/master/procedure/ModifyTableProcedure.java | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java index d23763c003..aa167038a8 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java @@ -34,6 +34,7 @@ import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Predicate; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.ServerName; @@ -572,6 +573,13 @@ public class RegionStates { return !getTableRegionStates(tableName).isEmpty(); } + /** + * @return Return OPEN regions of the table + */ + public List getOpenRegionsOfTable(final TableName table) { + return getRegionsOfTable(table, (state) -> state.isInState(State.OPEN)); + } + /** * @return Return online regions of table; does not include OFFLINE or SPLITTING regions. */ @@ -579,16 +587,23 @@ public class RegionStates { return getRegionsOfTable(table, false); } + /** + * @return Return online regions of table; does not include OFFLINE or SPLITTING regions. + */ + public List getRegionsOfTable(final TableName table, boolean offline) { + return getRegionsOfTable(table, (state) -> include(state, offline)); + } + /** * @return Return the regions of the table; does not include OFFLINE unless you set * offline to true. Does not include regions that are in the * {@link State#SPLIT} state. */ - public List getRegionsOfTable(final TableName table, final boolean offline) { + public List getRegionsOfTable(final TableName table, Predicate filter) { final ArrayList nodes = getTableRegionStateNodes(table); final ArrayList hris = new ArrayList(nodes.size()); for (RegionStateNode node: nodes) { - if (include(node, offline)) hris.add(node.getRegionInfo()); + if (filter.test(node)) hris.add(node.getRegionInfo()); } return hris; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java index dbf5139a27..220278484d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java @@ -466,7 +466,7 @@ public class ModifyTableProcedure private List getRegionInfoList(final MasterProcedureEnv env) throws IOException { if (regionInfoList == null) { regionInfoList = env.getAssignmentManager().getRegionStates() - .getRegionsOfTable(getTableName()); + .getOpenRegionsOfTable(getTableName()); } return regionInfoList; } -- 2.16.3