From 5d9d960bd5bd70093e02a583f2037b77151d78e7 Mon Sep 17 00:00:00 2001 From: Michael Stack Date: Tue, 21 Aug 2018 21:06:14 -0700 Subject: [PATCH] HBASE-21078 [amv2] CODE-BUG NPE in RTP doing Unassign --- .../apache/hadoop/hbase/master/RegionState.java | 27 ++++++++++++++++++++++ .../master/assignment/MoveRegionProcedure.java | 14 +++++++++++ .../hbase/master/assignment/UnassignProcedure.java | 16 +++++++++---- .../AbstractStateMachineTableProcedure.java | 15 +----------- 4 files changed, 54 insertions(+), 18 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/master/RegionState.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/master/RegionState.java index 7289ce855a..f9a0d5d303 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/master/RegionState.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/master/RegionState.java @@ -19,7 +19,10 @@ package org.apache.hadoop.hbase.master; import java.util.Date; import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.UnknownRegionException; +import org.apache.hadoop.hbase.client.DoNotRetryRegionException; import org.apache.hadoop.hbase.client.RegionInfo; +import org.apache.hadoop.hbase.client.RegionOfflineException; import org.apache.yetus.audience.InterfaceAudience; import org.apache.yetus.audience.InterfaceStability; @@ -423,4 +426,28 @@ public class RegionState { return (serverName != null ? serverName.hashCode() * 11 : 0) + hri.hashCode() + 5 * state.ordinal(); } + + /** + * Checks if online. Checks if OPEN, whether a split parent or not, if split, or if online flag + * set. Throws exception if not online. + * @return True if is online, else throws {@link DoNotRetryRegionException} + */ + public boolean isOnline() throws DoNotRetryRegionException { + if (!isOpened()) { + throw new DoNotRetryRegionException(getRegion().getEncodedName() + + " is not OPEN; regionState=" + this); + } + if (getRegion().isSplitParent()) { + throw new DoNotRetryRegionException(getRegion().getEncodedName() + + " is not online (splitParent=true)"); + } + if (getRegion().isSplit()) { + throw new DoNotRetryRegionException(getRegion().getEncodedName() + " has split=true"); + } + if (getRegion().isOffline()) { + // RegionOfflineException is not instance of DNRIOE so wrap it. + throw new DoNotRetryRegionException(new RegionOfflineException(getRegion().getEncodedName())); + } + return true; + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MoveRegionProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MoveRegionProcedure.java index 6135ce1cc6..fea8a174eb 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MoveRegionProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MoveRegionProcedure.java @@ -24,11 +24,13 @@ import java.io.IOException; import org.apache.hadoop.hbase.HBaseIOException; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.DoNotRetryRegionException; import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.master.RegionPlan; import org.apache.hadoop.hbase.master.procedure.AbstractStateMachineRegionProcedure; import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv; import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer; +import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting; import org.apache.yetus.audience.InterfaceAudience; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,6 +57,11 @@ public class MoveRegionProcedure extends AbstractStateMachineRegionProcedure if (rs == null) { throw new UnknownRegionException("No RegionState found for " + ri.getEncodedName()); } - if (!rs.isOpened()) { - throw new DoNotRetryRegionException(ri.getEncodedName() + " is not OPEN; regionState=" + rs); - } - if (ri.isSplitParent()) { - throw new DoNotRetryRegionException(ri.getEncodedName() + - " is not online (splitParent=true)"); - } - if (ri.isSplit()) { - throw new DoNotRetryRegionException(ri.getEncodedName() + " has split=true"); - } - if (ri.isOffline()) { - // RegionOfflineException is not instance of DNRIOE so wrap it. - throw new DoNotRetryRegionException(new RegionOfflineException(ri.getEncodedName())); - } + rs.isOnline(); } } -- 2.16.3