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..e8790e4 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; @@ -77,6 +78,7 @@ import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.SplitTableRegionState; +import org.apache.hadoop.util.ReflectionUtils; /** * The procedure to split a region in a table. @@ -592,6 +594,11 @@ public class SplitTableRegionProcedure // Split each store file. final TableDescriptor htd = env.getMasterServices().getTableDescriptors().get(getTableName()); + RegionSplitPolicy splitPolicy = null; + if(htd.getRegionSplitPolicyClassName() != null) { + Class clazz = RegionSplitPolicy.getSplitPolicyClass(htd, conf); + splitPolicy = ReflectionUtils.newInstance(clazz, conf); + } for (Map.Entry>e: files.entrySet()) { byte [] familyName = Bytes.toBytes(e.getKey()); final ColumnFamilyDescriptor hcd = htd.getColumnFamily(familyName); @@ -601,7 +608,7 @@ public class SplitTableRegionProcedure for (StoreFileInfo storeFileInfo: storeFiles) { StoreFileSplitter sfs = new StoreFileSplitter(regionFs, familyName, new HStoreFile(mfs.getFileSystem(), - storeFileInfo, conf, cacheConf, hcd.getBloomFilterType(), true)); + storeFileInfo, conf, cacheConf, hcd.getBloomFilterType(), true), splitPolicy); futures.add(threadPool.submit(sfs)); } } @@ -661,8 +668,8 @@ public class SplitTableRegionProcedure } } - private Pair splitStoreFile(HRegionFileSystem regionFs, byte[] family, HStoreFile sf) - throws IOException { + private Pair splitStoreFile(HRegionFileSystem regionFs, byte[] family, HStoreFile sf, + RegionSplitPolicy splitPolicy) throws IOException { if (LOG.isDebugEnabled()) { LOG.debug("pid=" + getProcId() + " splitting started for store file: " + sf.getPath() + " for region: " + getParentRegion().getShortNameToLog()); @@ -671,9 +678,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()); @@ -689,22 +696,24 @@ public class SplitTableRegionProcedure private final HRegionFileSystem regionFs; private final byte[] family; private final HStoreFile sf; - + private final RegionSplitPolicy splitPolicy; /** * Constructor that takes what it needs to split * @param regionFs the file system * @param family Family that contains the store file * @param sf which file */ - public StoreFileSplitter(HRegionFileSystem regionFs, byte[] family, HStoreFile sf) { + public StoreFileSplitter(HRegionFileSystem regionFs, byte[] family, HStoreFile sf, + RegionSplitPolicy splitPolicy) { this.regionFs = regionFs; this.sf = sf; this.family = family; + this.splitPolicy = splitPolicy; } @Override public Pair call() throws IOException { - return splitStoreFile(regionFs, family, sf); + return splitStoreFile(regionFs, family, sf, this.splitPolicy); } } 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..2804821 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 @@ -138,7 +138,6 @@ public abstract class RegionSplitPolicy extends Configured { * 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 */ protected boolean skipStoreFileRangeCheck(String familyName) { return false; 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() {