diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
index 0165778899a..670cf49ed47 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
@@ -157,6 +157,21 @@ public final class HConstants {
/** Default value for the balancer period */
public static final int DEFAULT_HBASE_BALANCER_PERIOD = 300000;
+ /**
+ * Config key for enable/disable automatically separate child regions to different region servers
+ * in the procedure of split regions. One child will be kept to the server where parent
+ * region is on, and the other child will be assigned to a random server.
+ * See HBASE-25518.
+ */
+ public static final String HBASE_ENABLE_SEPARATE_CHILD_REGIONS =
+ "hbase.master.auto.separate.child.regions.after.split.enabled";
+
+ /**
+ * Default value for automatically separate child regions to different region servers
+ * (set to "false" to keep all child regions to the server where parent region is on)
+ */
+ public static final boolean DEFAULT_HBASE_ENABLE_SEPARATE_CHILD_REGIONS = false;
+
/** The name of the ensemble table */
public static final TableName ENSEMBLE_TABLE_NAME = TableName.valueOf("hbase:ensemble");
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java
index d401141c9a4..e7be28bb932 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java
@@ -27,6 +27,7 @@ import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.hadoop.hbase.HBaseIOException;
+import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.RegionReplicaUtil;
@@ -43,6 +44,7 @@ import org.apache.hadoop.hbase.shaded.protobuf.RequestConverter;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse;
+import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_ENABLE_SEPARATE_CHILD_REGIONS;
/**
* Utility for this assignment package only.
@@ -199,6 +201,67 @@ final class AssignmentManagerUtil {
return ArrayUtils.addAll(primaryRegionProcs, replicaRegionAssignProcs);
}
+ /**
+ * Create round robin assign procedures for the given regions,
+ * according to the {@code regionReplication}.
+ *
+ * For rolling back, we will submit procedures directly to the {@code ProcedureExecutor}, so it is
+ * possible that we persist the newly scheduled procedures, and then crash before persisting the
+ * rollback state, so when we arrive here the second time, it is possible that some regions have
+ * already been associated with a TRSP.
+ * @param ignoreIfInTransition if true, will skip creating TRSP for the given region if it is
+ * already in transition, otherwise we will add an assert that it should not in
+ * transition.
+ */
+ private static TransitRegionStateProcedure[] createRoundRobinAssignProcedures(
+ MasterProcedureEnv env, List regions, int regionReplication,
+ List serversToExclude, boolean ignoreIfInTransition) {
+ List regionsAndReplicas = new ArrayList<>(regions);
+ if (regionReplication != DEFAULT_REGION_REPLICA) {
+
+ // collect the replica region infos
+ List replicaRegionInfos =
+ new ArrayList(regions.size() * (regionReplication - 1));
+ for (RegionInfo hri : regions) {
+ // start the index from 1
+ for (int i = 1; i < regionReplication; i++) {
+ replicaRegionInfos.add(RegionReplicaUtil.getRegionInfoForReplica(hri, i));
+ }
+ }
+ regionsAndReplicas.addAll(replicaRegionInfos);
+ }
+ if (ignoreIfInTransition) {
+ for (RegionInfo region : regionsAndReplicas) {
+ if (env.getAssignmentManager().getRegionStates().getOrCreateRegionStateNode(region)
+ .isInTransition()) {
+ return null;
+ }
+ }
+ }
+ // create round robin procs. Note that we exclude the primary region's target server
+ return env.getAssignmentManager()
+ .createRoundRobinAssignProcedures(regionsAndReplicas, serversToExclude);
+ }
+
+ static TransitRegionStateProcedure[] createAssignProceduresForSplitDaughters(
+ MasterProcedureEnv env, List daughters, int regionReplication,
+ ServerName parentServer) {
+ if(env.getMasterConfiguration().getBoolean(HConstants.HBASE_ENABLE_SEPARATE_CHILD_REGIONS,
+ DEFAULT_HBASE_ENABLE_SEPARATE_CHILD_REGIONS)){
+ // keep one daughter on the parent region server
+ TransitRegionStateProcedure[] daughterOne =
+ createAssignProcedures(env, Collections.singletonList(daughters.get(0)),
+ regionReplication, parentServer, false);
+ // round robin assign the other daughter
+ TransitRegionStateProcedure[] daughterTwo =
+ createRoundRobinAssignProcedures(env, Collections.singletonList(daughters.get(1)),
+ regionReplication, Collections.singletonList(parentServer), false);
+ return ArrayUtils.addAll(daughterOne, daughterTwo);
+ }
+ return createAssignProceduresForOpeningNewRegions(env, daughters, regionReplication,
+ parentServer);
+ }
+
static TransitRegionStateProcedure[] createAssignProceduresForOpeningNewRegions(
MasterProcedureEnv env, List regions, int regionReplication,
ServerName targetServer) {
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 e5b5fe9055e..3ed60583757 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
@@ -869,7 +869,7 @@ public class SplitTableRegionProcedure
List hris = new ArrayList(2);
hris.add(daughterOneRI);
hris.add(daughterTwoRI);
- return AssignmentManagerUtil.createAssignProceduresForOpeningNewRegions(env, hris,
+ return AssignmentManagerUtil.createAssignProceduresForSplitDaughters(env, hris,
getRegionReplication(env), getParentRegionServerName(env));
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/AssignmentTestingUtil.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/AssignmentTestingUtil.java
index 65001e2ce71..97fa2c006f8 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/AssignmentTestingUtil.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/AssignmentTestingUtil.java
@@ -24,12 +24,16 @@ import java.io.IOException;
import java.util.Set;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.Waiter;
import org.apache.hadoop.hbase.Waiter.ExplainingPredicate;
+import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.master.HMaster;
import org.apache.hadoop.hbase.master.RegionState.State;
import org.apache.hadoop.hbase.master.procedure.ProcedureSyncWait;
+import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.Threads;
import org.apache.yetus.audience.InterfaceAudience;
import org.apache.yetus.audience.InterfaceStability;
@@ -152,4 +156,25 @@ public final class AssignmentTestingUtil {
proc, 5L * 60 * 1000);
return true;
}
+
+ public static void insertData(final HBaseTestingUtility UTIL, final TableName tableName,
+ int rowCount, int startRowNum, String... cfs) throws IOException {
+ Table t = UTIL.getConnection().getTable(tableName);
+ Put p;
+ for (int i = 0; i < rowCount / 2; i++) {
+ p = new Put(Bytes.toBytes("" + (startRowNum + i)));
+ for (String cf : cfs) {
+ p.addColumn(Bytes.toBytes(cf), Bytes.toBytes("q"), Bytes.toBytes(i));
+ }
+ t.put(p);
+ p = new Put(Bytes.toBytes("" + (startRowNum + rowCount - i - 1)));
+ for (String cf : cfs) {
+ p.addColumn(Bytes.toBytes(cf), Bytes.toBytes("q"), Bytes.toBytes(i));
+ }
+ t.put(p);
+ if (i % 5 == 0) {
+ UTIL.getAdmin().flush(tableName);
+ }
+ }
+ }
}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java
index 5fe45b7a387..a64795aaa3f 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java
@@ -17,22 +17,24 @@
*/
package org.apache.hadoop.hbase.master.assignment;
+import static org.apache.hadoop.hbase.master.assignment.AssignmentTestingUtil.insertData;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-import java.io.IOException;
+import java.util.List;
+import java.util.Map;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.StartMiniClusterOption;
import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.RegionInfo;
-import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
import org.apache.hadoop.hbase.master.procedure.MasterProcedureTestingUtility;
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;
+import org.apache.hadoop.hbase.regionserver.HRegion;
import org.apache.hadoop.hbase.testclassification.MasterTests;
import org.apache.hadoop.hbase.testclassification.MediumTests;
import org.apache.hadoop.hbase.util.Bytes;
@@ -60,7 +62,7 @@ public class TestRegionSplit {
protected static final HBaseTestingUtility UTIL = new HBaseTestingUtility();
- private static String ColumnFamilyName = "cf";
+ private static String columnFamilyName = "cf";
private static final int startRowNum = 11;
private static final int rowCount = 60;
@@ -94,7 +96,8 @@ public class TestRegionSplit {
UTIL.getHBaseCluster().getMaster().setCatalogJanitorEnabled(false);
// Disable compaction.
for (int i = 0; i < UTIL.getHBaseCluster().getLiveRegionServerThreads().size(); i++) {
- UTIL.getHBaseCluster().getRegionServer(i).getCompactSplitThread().switchCompaction(false);
+ UTIL.getHBaseCluster().getRegionServer(i).getCompactSplitThread().switchCompaction(
+ false);
}
}
@@ -111,8 +114,8 @@ public class TestRegionSplit {
final ProcedureExecutor procExec = getMasterProcedureExecutor();
RegionInfo[] regions =
- MasterProcedureTestingUtility.createTable(procExec, tableName, null, ColumnFamilyName);
- insertData(tableName);
+ MasterProcedureTestingUtility.createTable(procExec, tableName, null, columnFamilyName);
+ insertData(UTIL, tableName, rowCount, startRowNum, columnFamilyName);
int splitRowNum = startRowNum + rowCount / 2;
byte[] splitKey = Bytes.toBytes("" + splitRowNum);
@@ -121,7 +124,7 @@ public class TestRegionSplit {
// Split region of the table
long procId = procExec.submitProcedure(
- new SplitTableRegionProcedure(procExec.getEnvironment(), regions[0], splitKey));
+ new SplitTableRegionProcedure(procExec.getEnvironment(), regions[0], splitKey));
// Wait the completion
ProcedureTestingUtility.waitProcedure(procExec, procId);
ProcedureTestingUtility.assertProcNotFailed(procExec, procId);
@@ -146,22 +149,12 @@ public class TestRegionSplit {
UTIL.getAdmin().enableTable(tableName);
Thread.sleep(500);
- assertEquals("Table region not correct.", 2,
- UTIL.getHBaseCluster().getRegions(tableName).size());
- }
-
- private void insertData(final TableName tableName) throws IOException {
- Table t = UTIL.getConnection().getTable(tableName);
- Put p;
- for (int i = 0; i < rowCount / 2; i++) {
- p = new Put(Bytes.toBytes("" + (startRowNum + i)));
- p.addColumn(Bytes.toBytes(ColumnFamilyName), Bytes.toBytes("q1"), Bytes.toBytes(i));
- t.put(p);
- p = new Put(Bytes.toBytes("" + (startRowNum + rowCount - i - 1)));
- p.addColumn(Bytes.toBytes(ColumnFamilyName), Bytes.toBytes("q1"), Bytes.toBytes(i));
- t.put(p);
- }
- UTIL.getAdmin().flush(tableName);
+ List tableRegions = UTIL.getHBaseCluster().getRegions(tableName);
+ assertEquals("Table region not correct.", 2, tableRegions.size());
+ Map regionInfoMap = UTIL.getHBaseCluster().getMaster()
+ .getAssignmentManager().getRegionStates().getRegionAssignments();
+ assertEquals(regionInfoMap.get(tableRegions.get(0).getRegionInfo()),
+ regionInfoMap.get(tableRegions.get(1).getRegionInfo()));
}
private ProcedureExecutor getMasterProcedureExecutor() {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplitAndSeparateChildren.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplitAndSeparateChildren.java
new file mode 100644
index 00000000000..18aa2f84b3f
--- /dev/null
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplitAndSeparateChildren.java
@@ -0,0 +1,169 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.master.assignment;
+
+import java.util.List;
+import java.util.Map;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.StartMiniClusterOption;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.hbase.client.TableDescriptor;
+import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
+import org.apache.hadoop.hbase.master.procedure.MasterProcedureTestingUtility;
+import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
+import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;
+import org.apache.hadoop.hbase.regionserver.HRegion;
+import org.apache.hadoop.hbase.testclassification.MasterTests;
+import org.apache.hadoop.hbase.testclassification.MediumTests;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.JVMClusterUtil;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import static org.apache.hadoop.hbase.master.assignment.AssignmentTestingUtil.insertData;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+
+@Category({ MasterTests.class, MediumTests.class})
+public class TestRegionSplitAndSeparateChildren {
+
+ @ClassRule
+ public static final HBaseClassTestRule CLASS_RULE =
+ HBaseClassTestRule.forClass(TestRegionSplitAndSeparateChildren.class);
+
+ private static final Logger LOG = LoggerFactory.getLogger(
+ TestRegionSplitAndSeparateChildren.class);
+
+ protected static final HBaseTestingUtility UTIL = new HBaseTestingUtility();
+
+ private static String columnFamilyName = "cf";
+
+ private static final int startRowNum = 11;
+ private static final int rowCount = 60;
+
+ @Rule
+ public TestName name = new TestName();
+
+ private static void setupConf(Configuration conf) {
+ // enable automatically separate child regions
+ conf.setBoolean(HConstants.HBASE_ENABLE_SEPARATE_CHILD_REGIONS, true);
+ }
+
+ @BeforeClass
+ public static void setupCluster() throws Exception {
+ setupConf(UTIL.getConfiguration());
+ StartMiniClusterOption option =
+ StartMiniClusterOption.builder().numMasters(1).numRegionServers(3).numDataNodes(3).build();
+ UTIL.startMiniCluster(option);
+ }
+
+ @AfterClass
+ public static void cleanupTest() throws Exception {
+ try {
+ UTIL.shutdownMiniCluster();
+ } catch (Exception e) {
+ LOG.warn("failure shutting down cluster", e);
+ }
+ }
+
+ @Before
+ public void setup() throws Exception {
+ // Turn off the meta scanner so it don't remove parent on us.
+ UTIL.getHBaseCluster().getMaster().setCatalogJanitorEnabled(false);
+ // Disable compaction.
+ for (int i = 0; i < UTIL.getHBaseCluster().getLiveRegionServerThreads().size(); i++) {
+ UTIL.getHBaseCluster().getRegionServer(i).getCompactSplitThread().switchCompaction(
+ false);
+ }
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ for (TableDescriptor htd : UTIL.getAdmin().listTableDescriptors()) {
+ UTIL.deleteTable(htd.getTableName());
+ }
+ }
+
+ @Test
+ public void testSplitTableRegionAndSeparateChildRegions() throws Exception {
+ final TableName tableName = TableName.valueOf(name.getMethodName());
+ final ProcedureExecutor procExec = getMasterProcedureExecutor();
+
+ RegionInfo[] regions =
+ MasterProcedureTestingUtility.createTable(procExec, tableName, null, columnFamilyName);
+ insertData(UTIL, tableName, rowCount, startRowNum, columnFamilyName);
+ int splitRowNum = startRowNum + rowCount / 2;
+ byte[] splitKey = Bytes.toBytes("" + splitRowNum);
+
+ assertTrue("not able to find a splittable region", regions != null);
+ assertTrue("not able to find a splittable region", regions.length == 1);
+
+ // Split region of the table
+ long procId = procExec.submitProcedure(
+ new SplitTableRegionProcedure(procExec.getEnvironment(), regions[0], splitKey));
+ // Wait the completion
+ ProcedureTestingUtility.waitProcedure(procExec, procId);
+ ProcedureTestingUtility.assertProcNotFailed(procExec, procId);
+
+ assertTrue("not able to split table",
+ UTIL.getHBaseCluster().getRegions(tableName).size() == 2);
+
+ //disable table
+ UTIL.getAdmin().disableTable(tableName);
+ Thread.sleep(500);
+
+ //stop master
+ UTIL.getHBaseCluster().stopMaster(0);
+ UTIL.getHBaseCluster().waitOnMaster(0);
+ Thread.sleep(500);
+
+ //restart master
+ JVMClusterUtil.MasterThread t = UTIL.getHBaseCluster().startMaster();
+ Thread.sleep(500);
+
+ UTIL.invalidateConnection();
+ // enable table
+ UTIL.getAdmin().enableTable(tableName);
+ Thread.sleep(500);
+
+ List tableRegions = UTIL.getHBaseCluster().getRegions(tableName);
+ assertEquals("Table region not correct.", 2, tableRegions.size());
+ Map regionInfoMap = UTIL.getHBaseCluster().getMaster()
+ .getAssignmentManager().getRegionStates().getRegionAssignments();
+ assertNotEquals(regionInfoMap.get(tableRegions.get(0).getRegionInfo()),
+ regionInfoMap.get(tableRegions.get(1).getRegionInfo()));
+ }
+
+ private ProcedureExecutor getMasterProcedureExecutor() {
+ return UTIL.getHBaseCluster().getMaster().getMasterProcedureExecutor();
+ }
+}
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestSplitTableRegionProcedure.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestSplitTableRegionProcedure.java
index 3f9f960b92f..4e07b9a8808 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestSplitTableRegionProcedure.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestSplitTableRegionProcedure.java
@@ -17,6 +17,7 @@
*/
package org.apache.hadoop.hbase.master.assignment;
+import static org.apache.hadoop.hbase.master.assignment.AssignmentTestingUtil.insertData;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -35,7 +36,6 @@ import org.apache.hadoop.hbase.Waiter;
import org.apache.hadoop.hbase.client.CompactionState;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
-import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Table;
@@ -73,8 +73,8 @@ public class TestSplitTableRegionProcedure {
protected static final HBaseTestingUtility UTIL = new HBaseTestingUtility();
- private static String ColumnFamilyName1 = "cf1";
- private static String ColumnFamilyName2 = "cf2";
+ private static String columnFamilyName1 = "cf1";
+ private static String columnFamilyName2 = "cf2";
private static final int startRowNum = 11;
private static final int rowCount = 60;
@@ -143,8 +143,8 @@ public class TestSplitTableRegionProcedure {
final ProcedureExecutor procExec = getMasterProcedureExecutor();
RegionInfo [] regions = MasterProcedureTestingUtility.createTable(
- procExec, tableName, null, ColumnFamilyName1, ColumnFamilyName2);
- insertData(tableName);
+ procExec, tableName, null, columnFamilyName1, columnFamilyName2);
+ insertData(UTIL, tableName, rowCount, startRowNum, columnFamilyName1, columnFamilyName2);
int splitRowNum = startRowNum + rowCount / 2;
byte[] splitKey = Bytes.toBytes("" + splitRowNum);
@@ -177,7 +177,7 @@ public class TestSplitTableRegionProcedure {
final ProcedureExecutor procExec = getMasterProcedureExecutor();
RegionInfo [] regions = MasterProcedureTestingUtility.createTable(
- procExec, tableName, null, ColumnFamilyName1, ColumnFamilyName2);
+ procExec, tableName, null, columnFamilyName1, columnFamilyName2);
int splitRowNum = startRowNum + rowCount / 2;
byte[] splitKey = Bytes.toBytes("" + splitRowNum);
@@ -207,8 +207,8 @@ public class TestSplitTableRegionProcedure {
final ProcedureExecutor procExec = getMasterProcedureExecutor();
RegionInfo [] regions = MasterProcedureTestingUtility.createTable(
- procExec, tableName, null, ColumnFamilyName1, ColumnFamilyName2);
- insertData(tableName);
+ procExec, tableName, null, columnFamilyName1, columnFamilyName2);
+ insertData(UTIL, tableName, rowCount, startRowNum, columnFamilyName1, columnFamilyName2);
// Split to two daughters with one of them only has 1 row
int splitRowNum = startRowNum + rowCount / 4;
byte[] splitKey = Bytes.toBytes("" + splitRowNum);
@@ -238,8 +238,8 @@ public class TestSplitTableRegionProcedure {
final ProcedureExecutor procExec = getMasterProcedureExecutor();
RegionInfo [] regions = MasterProcedureTestingUtility.createTable(
- procExec, tableName, null, ColumnFamilyName1, ColumnFamilyName2);
- insertData(tableName);
+ procExec, tableName, null, columnFamilyName1, columnFamilyName2);
+ insertData(UTIL, tableName, rowCount, startRowNum, columnFamilyName1, columnFamilyName2);
// Split to two daughters with one of them only has 1 row
int splitRowNum = startRowNum + rowCount;
byte[] splitKey = Bytes.toBytes("" + splitRowNum);
@@ -274,8 +274,8 @@ public class TestSplitTableRegionProcedure {
final ProcedureExecutor procExec = getMasterProcedureExecutor();
RegionInfo [] regions = MasterProcedureTestingUtility.createTable(
- procExec, tableName, null, ColumnFamilyName1, ColumnFamilyName2);
- insertData(tableName);
+ procExec, tableName, null, columnFamilyName1, columnFamilyName2);
+ insertData(UTIL, tableName, rowCount, startRowNum, columnFamilyName1, columnFamilyName2);
// Split to two daughters with one of them only has 1 row
int splitRowNum = rowCount;
deleteData(tableName, splitRowNum);
@@ -320,8 +320,8 @@ public class TestSplitTableRegionProcedure {
final ProcedureExecutor procExec = getMasterProcedureExecutor();
RegionInfo [] regions = MasterProcedureTestingUtility.createTable(
- procExec, tableName, null, ColumnFamilyName1, ColumnFamilyName2);
- insertData(tableName);
+ procExec, tableName, null, columnFamilyName1, columnFamilyName2);
+ insertData(UTIL, tableName, rowCount, startRowNum, columnFamilyName1, columnFamilyName2);
assertTrue("not able to find a splittable region", regions != null);
assertTrue("not able to find a splittable region", regions.length == 1);
@@ -349,8 +349,8 @@ public class TestSplitTableRegionProcedure {
final ProcedureExecutor procExec = getMasterProcedureExecutor();
RegionInfo[] regions = MasterProcedureTestingUtility.createTable(
- procExec, tableName, null, ColumnFamilyName1, ColumnFamilyName2);
- insertData(tableName);
+ procExec, tableName, null, columnFamilyName1, columnFamilyName2);
+ insertData(UTIL, tableName, rowCount, startRowNum, columnFamilyName1, columnFamilyName2);
int splitRowNum = startRowNum + rowCount / 2;
byte[] splitKey = Bytes.toBytes("" + splitRowNum);
@@ -379,7 +379,7 @@ public class TestSplitTableRegionProcedure {
List newRegions = UTIL.getMiniHBaseCluster().getRegions(tableName);
assertEquals(1, newRegions.size());
verifyData(newRegions.get(0), startRowNum, rowCount,
- Bytes.toBytes(ColumnFamilyName1), Bytes.toBytes(ColumnFamilyName2));
+ Bytes.toBytes(columnFamilyName1), Bytes.toBytes(columnFamilyName2));
assertEquals(splitSubmittedCount + 1, splitProcMetrics.getSubmittedCounter().getCount());
assertEquals(splitFailedCount + 1, splitProcMetrics.getFailedCounter().getCount());
@@ -391,8 +391,8 @@ public class TestSplitTableRegionProcedure {
final ProcedureExecutor procExec = getMasterProcedureExecutor();
RegionInfo [] regions = MasterProcedureTestingUtility.createTable(
- procExec, tableName, null, ColumnFamilyName1, ColumnFamilyName2);
- insertData(tableName);
+ procExec, tableName, null, columnFamilyName1, columnFamilyName2);
+ insertData(UTIL, tableName, rowCount, startRowNum, columnFamilyName1, columnFamilyName2);
int splitRowNum = startRowNum + rowCount / 2;
byte[] splitKey = Bytes.toBytes("" + splitRowNum);
@@ -425,8 +425,8 @@ public class TestSplitTableRegionProcedure {
final ProcedureExecutor procExec = getMasterProcedureExecutor();
RegionInfo [] regions = MasterProcedureTestingUtility.createTable(
- procExec, tableName, null, ColumnFamilyName1, ColumnFamilyName2);
- insertData(tableName);
+ procExec, tableName, null, columnFamilyName1, columnFamilyName2);
+ insertData(UTIL, tableName, rowCount, startRowNum, columnFamilyName1, columnFamilyName2);
int splitRowNum = startRowNum + rowCount / 2;
byte[] splitKey = Bytes.toBytes("" + splitRowNum);
@@ -452,24 +452,6 @@ public class TestSplitTableRegionProcedure {
verify(tableName, splitRowNum);
}
- private void insertData(final TableName tableName) throws IOException, InterruptedException {
- Table t = UTIL.getConnection().getTable(tableName);
- Put p;
- for (int i= 0; i < rowCount / 2; i++) {
- p = new Put(Bytes.toBytes("" + (startRowNum + i)));
- p.addColumn(Bytes.toBytes(ColumnFamilyName1), Bytes.toBytes("q1"), Bytes.toBytes(i));
- p.addColumn(Bytes.toBytes(ColumnFamilyName2), Bytes.toBytes("q2"), Bytes.toBytes(i));
- t.put(p);
- p = new Put(Bytes.toBytes("" + (startRowNum + rowCount - i - 1)));
- p.addColumn(Bytes.toBytes(ColumnFamilyName1), Bytes.toBytes("q1"), Bytes.toBytes(i));
- p.addColumn(Bytes.toBytes(ColumnFamilyName2), Bytes.toBytes("q2"), Bytes.toBytes(i));
- t.put(p);
- if (i % 5 == 0) {
- UTIL.getAdmin().flush(tableName);
- }
- }
- }
-
private void deleteData(
final TableName tableName,
final int startDeleteRowNum) throws IOException, InterruptedException {
@@ -505,8 +487,8 @@ public class TestSplitTableRegionProcedure {
daughters.get(i),
startRow,
numRows,
- Bytes.toBytes(ColumnFamilyName1),
- Bytes.toBytes(ColumnFamilyName2));
+ Bytes.toBytes(columnFamilyName1),
+ Bytes.toBytes(columnFamilyName2));
}
}