diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java index 1513c25..91e7b0c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java @@ -63,6 +63,7 @@ import org.apache.hadoop.hbase.quotas.QuotaExceededException; import org.apache.hadoop.hbase.regionserver.HRegionFileSystem; import org.apache.hadoop.hbase.regionserver.HStore; import org.apache.hadoop.hbase.regionserver.HStoreFile; +import org.apache.hadoop.hbase.regionserver.RegionSplitPolicy; import org.apache.hadoop.hbase.regionserver.StoreFileInfo; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; @@ -91,6 +92,8 @@ public class SplitTableRegionProcedure private RegionInfo daughter_1_RI; private RegionInfo daughter_2_RI; private byte[] bestSplitRow; + private TableDescriptor htd; + private RegionSplitPolicy splitPolicy; public SplitTableRegionProcedure() { // Required by the Procedure framework to create the procedure on replay @@ -115,6 +118,10 @@ public class SplitTableRegionProcedure .setSplit(false) .setRegionId(rid) .build(); + this.htd = env.getMasterServices().getTableDescriptors().get(getTableName()); + if(htd.getRegionSplitPolicyClassName() != null) { + this.splitPolicy = RegionSplitPolicy.create(htd, env.getMasterConfiguration()); + } } /** @@ -591,7 +598,6 @@ public class SplitTableRegionProcedure final List>> futures = new ArrayList>>(nbFiles); // Split each store file. - final TableDescriptor htd = env.getMasterServices().getTableDescriptors().get(getTableName()); for (Map.Entry>e: files.entrySet()) { byte [] familyName = Bytes.toBytes(e.getKey()); final ColumnFamilyDescriptor hcd = htd.getColumnFamily(familyName); @@ -661,8 +667,7 @@ public class SplitTableRegionProcedure } } - private Pair splitStoreFile(HRegionFileSystem regionFs, byte[] family, HStoreFile sf) - throws IOException { + private Pair splitStoreFile(HRegionFileSystem regionFs, byte[] family, HStoreFile sf) throws IOException { if (LOG.isDebugEnabled()) { LOG.debug("pid=" + getProcId() + " splitting started for store file: " + sf.getPath() + " for region: " + getParentRegion().getShortNameToLog()); @@ -671,9 +676,9 @@ public class SplitTableRegionProcedure final byte[] splitRow = getSplitRow(); final String familyName = Bytes.toString(family); final Path path_first = - regionFs.splitStoreFile(this.daughter_1_RI, familyName, sf, splitRow, false, null); + regionFs.splitStoreFile(this.daughter_1_RI, familyName, sf, splitRow, false, splitPolicy); final Path path_second = - regionFs.splitStoreFile(this.daughter_2_RI, familyName, sf, splitRow, true, null); + regionFs.splitStoreFile(this.daughter_2_RI, familyName, sf, splitRow, true, splitPolicy); if (LOG.isDebugEnabled()) { LOG.debug("pid=" + getProcId() + " splitting complete for store file: " + sf.getPath() + " for region: " + getParentRegion().getShortNameToLog()); 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 e92bdb1..8d7cb33 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 @@ -26,9 +26,9 @@ import org.apache.hadoop.conf.Configured; import org.apache.hadoop.hbase.HBaseInterfaceAudience; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.client.TableDescriptor; +import org.apache.hadoop.hbase.master.assignment.SplitTableRegionProcedure; import org.apache.hadoop.util.ReflectionUtils; import org.apache.yetus.audience.InterfaceAudience; - import org.apache.hbase.thirdparty.com.google.common.base.Preconditions; @@ -103,6 +103,7 @@ public abstract class RegionSplitPolicy extends Configured { */ public static RegionSplitPolicy create(HRegion region, Configuration conf) throws IOException { + Preconditions.checkNotNull(region, "Region should not be null."); Class clazz = getSplitPolicyClass( region.getTableDescriptor(), conf); RegionSplitPolicy policy = ReflectionUtils.newInstance(clazz, conf); @@ -110,6 +111,23 @@ public abstract class RegionSplitPolicy extends Configured { return policy; } + /** + * Create the RegionSplitPolicy configured for the given table. This API can be used where we + * don't have Region reference but needs split policy. For example in + * {@link SplitTableRegionProcedure} split policy is required to to invoke + * {@link #skipStoreFileRangeCheck(String)}. + * @param tableDescriptor + * @param conf + * @return policy RegionSplitPolicy + * @throws IOException + */ + public static RegionSplitPolicy create(TableDescriptor tableDescriptor, Configuration conf) + throws IOException { + Class clazz = getSplitPolicyClass(tableDescriptor, conf); + RegionSplitPolicy policy = ReflectionUtils.newInstance(clazz, conf); + return policy; + } + public static Class getSplitPolicyClass( TableDescriptor htd, Configuration conf) throws IOException { String className = htd.getRegionSplitPolicyClassName(); @@ -136,7 +154,6 @@ public abstract class RegionSplitPolicy extends Configured { * if split row not lies in the StoreFile range. But in some use cases we may need to create * the split reference even when the split row not lies in the range. This method can be used * to decide, whether to skip the the StoreFile range check or not. - * @return whether to skip the StoreFile range check or not * @param familyName * @return whether to skip the StoreFile range check or not */ diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java index ab2d4b4..f254452 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java @@ -986,7 +986,7 @@ public class TestSplitTransactionOnCluster { } } - static class CustomSplitPolicy extends RegionSplitPolicy { + static class CustomSplitPolicy extends IncreasingToUpperBoundRegionSplitPolicy { @Override protected boolean shouldSplit() {