From a8546ccb8c4868ac6ed668b94391ad4b5dd4509a Mon Sep 17 00:00:00 2001 From: "terence.yoo" Date: Tue, 17 Nov 2015 13:42:52 +0900 Subject: [PATCH] Admin.mergeRegions should use full region names instead of encoded region names --- .../java/org/apache/hadoop/hbase/client/Admin.java | 6 +++--- .../org/apache/hadoop/hbase/client/HBaseAdmin.java | 22 ++++++++++++++-------- .../MergeRandomAdjacentRegionsOfTableAction.java | 2 +- .../master/normalizer/MergeNormalizationPlan.java | 4 ++-- .../org/apache/hadoop/hbase/client/TestAdmin1.java | 4 ++-- .../hbase/client/TestHBaseAdminNoCluster.java | 4 +++- .../coprocessor/TestRegionServerObserver.java | 4 ++-- .../hbase/master/TestAssignmentListener.java | 4 ++-- .../hbase/namespace/TestNamespaceAuditor.java | 4 ++-- .../TestRegionMergeTransactionOnCluster.java | 11 ++++++----- .../snapshot/TestFlushSnapshotFromClient.java | 16 ++++++++-------- .../hadoop/hbase/util/TestHBaseFsckOneRS.java | 2 +- 12 files changed, 46 insertions(+), 37 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java index 972939e..e374b37 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java @@ -864,13 +864,13 @@ public interface Admin extends Abortable, Closeable { /** * Merge two regions. Asynchronous operation. * - * @param encodedNameOfRegionA encoded name of region a - * @param encodedNameOfRegionB encoded name of region b + * @param nameOfRegionA name of region a + * @param nameOfRegionB name of region b * @param forcible true if do a compulsory merge, otherwise we will only merge two adjacent * regions * @throws IOException */ - void mergeRegions(final byte[] encodedNameOfRegionA, final byte[] encodedNameOfRegionB, + void mergeRegions(final byte[] nameOfRegionA, final byte[] nameOfRegionB, final boolean forcible) throws IOException; /** diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java index ba369c0..6c8051a 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java @@ -2269,20 +2269,24 @@ public class HBaseAdmin implements Admin { /** * Merge two regions. Asynchronous operation. - * @param encodedNameOfRegionA encoded name of region a - * @param encodedNameOfRegionB encoded name of region b + * @param nameOfRegionA name of region a + * @param nameOfRegionB name of region b * @param forcible true if do a compulsory merge, otherwise we will only merge * two adjacent regions * @throws IOException */ @Override - public void mergeRegions(final byte[] encodedNameOfRegionA, - final byte[] encodedNameOfRegionB, final boolean forcible) + public void mergeRegions(final byte[] nameOfRegionA, + final byte[] nameOfRegionB, final boolean forcible) throws IOException { - Pair pair = getRegion(encodedNameOfRegionA); + // ensure full region names + HRegionInfo.parseRegionName(nameOfRegionA); + HRegionInfo.parseRegionName(nameOfRegionB); + + Pair pair = getRegion(nameOfRegionA); if (pair != null && pair.getFirst().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID) throw new IllegalArgumentException("Can't invoke merge on non-default regions directly"); - pair = getRegion(encodedNameOfRegionB); + pair = getRegion(nameOfRegionB); if (pair != null && pair.getFirst().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID) throw new IllegalArgumentException("Can't invoke merge on non-default regions directly"); executeCallable(new MasterCallable(getConnection()) { @@ -2290,8 +2294,10 @@ public class HBaseAdmin implements Admin { public Void call(int callTimeout) throws ServiceException { try { DispatchMergingRegionsRequest request = RequestConverter - .buildDispatchMergingRegionsRequest(encodedNameOfRegionA, - encodedNameOfRegionB, forcible); + .buildDispatchMergingRegionsRequest( + HRegionInfo.encodeRegionName(nameOfRegionA).getBytes(), + HRegionInfo.encodeRegionName(nameOfRegionB).getBytes(), + forcible); master.dispatchMergingRegions(null, request); } catch (DeserializationException de) { LOG.error("Could not parse destination server name: " + de); diff --git a/hbase-it/src/test/java/org/apache/hadoop/hbase/chaos/actions/MergeRandomAdjacentRegionsOfTableAction.java b/hbase-it/src/test/java/org/apache/hadoop/hbase/chaos/actions/MergeRandomAdjacentRegionsOfTableAction.java index 8645dc4..53fbe53 100644 --- a/hbase-it/src/test/java/org/apache/hadoop/hbase/chaos/actions/MergeRandomAdjacentRegionsOfTableAction.java +++ b/hbase-it/src/test/java/org/apache/hadoop/hbase/chaos/actions/MergeRandomAdjacentRegionsOfTableAction.java @@ -65,7 +65,7 @@ public class MergeRandomAdjacentRegionsOfTableAction extends Action { } try { - admin.mergeRegions(a.getEncodedNameAsBytes(), b.getEncodedNameAsBytes(), false); + admin.mergeRegions(a.getRegionName(), b.getRegionName(), false); } catch (Exception ex) { LOG.warn("Merge failed, might be caused by other chaos: " + ex.getMessage()); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/MergeNormalizationPlan.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/MergeNormalizationPlan.java index 08a58a5..4b9e5f4 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/MergeNormalizationPlan.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/MergeNormalizationPlan.java @@ -64,8 +64,8 @@ public class MergeNormalizationPlan implements NormalizationPlan { public void execute(Admin admin) { LOG.info("Executing merging normalization plan: " + this); try { - admin.mergeRegions(firstRegion.getEncodedNameAsBytes(), - secondRegion.getEncodedNameAsBytes(), true); + admin.mergeRegions(firstRegion.getRegionName(), + secondRegion.getRegionName(), true); } catch (IOException ex) { LOG.error("Error during region merge: ", ex); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin1.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin1.java index eabff98..2acf8c5 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin1.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin1.java @@ -1222,8 +1222,8 @@ public class TestAdmin1 { gotException = false; // Try merging a replica with another. Should fail. try { - TEST_UTIL.getHBaseAdmin().mergeRegions(regions.get(1).getFirst().getEncodedNameAsBytes(), - regions.get(2).getFirst().getEncodedNameAsBytes(), true); + TEST_UTIL.getHBaseAdmin().mergeRegions(regions.get(1).getFirst().getRegionName(), + regions.get(2).getFirst().getRegionName(), true); } catch (IllegalArgumentException m) { gotException = true; } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHBaseAdminNoCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHBaseAdminNoCluster.java index 4b8de7a..fffe7b5 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHBaseAdminNoCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHBaseAdminNoCluster.java @@ -31,6 +31,7 @@ import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HTableDescriptor; +import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.MasterNotRunningException; import org.apache.hadoop.hbase.PleaseHoldException; import org.apache.hadoop.hbase.TableName; @@ -270,7 +271,8 @@ public class TestHBaseAdminNoCluster { testMasterOperationIsRetried(new MethodCaller() { @Override public void call(Admin admin) throws Exception { - admin.mergeRegions(new byte[0], new byte[0], true); + admin.mergeRegions(HRegionInfo.FIRST_META_REGIONINFO.getRegionName(), + HRegionInfo.FIRST_META_REGIONINFO.getRegionName(), true); } @Override public void verify(MasterKeepAliveConnection masterAdmin, int count) throws Exception { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerObserver.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerObserver.java index 9fcfd43..59061ed 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerObserver.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerObserver.java @@ -92,8 +92,8 @@ public class TestRegionServerObserver { admin.createTable(desc, new byte[][] { Bytes.toBytes("row") }); assertFalse(regionServerObserver.wasRegionMergeCalled()); List regions = regionServer.getOnlineRegions(TableName.valueOf(TABLENAME)); - admin.mergeRegions(regions.get(0).getRegionInfo().getEncodedNameAsBytes(), regions.get(1) - .getRegionInfo().getEncodedNameAsBytes(), true); + admin.mergeRegions(regions.get(0).getRegionInfo().getRegionName(), regions.get(1) + .getRegionInfo().getRegionName(), true); int regionsCount = regionServer.getOnlineRegions(TableName.valueOf(TABLENAME)).size(); while (regionsCount != 1) { regionsCount = regionServer.getOnlineRegions(TableName.valueOf(TABLENAME)).size(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentListener.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentListener.java index 5b3abea..383cd54 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentListener.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestAssignmentListener.java @@ -242,8 +242,8 @@ public class TestAssignmentListener { listener.reset(); List regions = admin.getTableRegions(TABLE_NAME); assertEquals(2, regions.size()); - admin.mergeRegions(regions.get(0).getEncodedNameAsBytes(), - regions.get(1).getEncodedNameAsBytes(), true); + admin.mergeRegions(regions.get(0).getRegionName(), + regions.get(1).getRegionName(), true); listener.awaitModifications(3); assertEquals(1, admin.getTableRegions(TABLE_NAME).size()); assertEquals(1, listener.getLoadCount()); // new merged region added diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java index 7ded3d3..923f1d3 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java @@ -326,7 +326,7 @@ public class TestNamespaceAuditor { // merge the two regions final Set encodedRegionNamesToMerge = Sets.newHashSet(hris.get(0).getEncodedName(), hris.get(1).getEncodedName()); - ADMIN.mergeRegions(hris.get(0).getEncodedNameAsBytes(), hris.get(1).getEncodedNameAsBytes(), + ADMIN.mergeRegions(hris.get(0).getRegionName(), hris.get(1).getRegionName(), false); UTIL.waitFor(10000, 100, new Waiter.ExplainingPredicate() { @@ -412,7 +412,7 @@ public class TestNamespaceAuditor { regionServerObserver.failMerge(true); regionServerObserver.triggered = false; - ADMIN.mergeRegions(hris.get(1).getEncodedNameAsBytes(), hris.get(2).getEncodedNameAsBytes(), + ADMIN.mergeRegions(hris.get(1).getRegionName(), hris.get(2).getRegionName(), false); regionServerObserver.waitUtilTriggered(); hris = ADMIN.getTableRegions(tableTwo); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.java index 1c99fe3..230e501 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.java @@ -290,7 +290,7 @@ public class TestRegionMergeTransactionOnCluster { regionStates.regionOffline(a); try { // Merge offline region. Region a is offline here - admin.mergeRegions(a.getEncodedNameAsBytes(), b.getEncodedNameAsBytes(), false); + admin.mergeRegions(a.getRegionName(), b.getRegionName(), false); fail("Offline regions should not be able to merge"); } catch (IOException ie) { System.out.println(ie); @@ -300,7 +300,7 @@ public class TestRegionMergeTransactionOnCluster { } try { // Merge the same region: b and b. - admin.mergeRegions(b.getEncodedNameAsBytes(), b.getEncodedNameAsBytes(), true); + admin.mergeRegions(b.getRegionName(), b.getRegionName(), true); fail("A region should not be able to merge with itself, even forcifully"); } catch (IOException ie) { assertTrue("Exception should mention regions not online", @@ -313,7 +313,8 @@ public class TestRegionMergeTransactionOnCluster { fail("Unknown region could not be merged"); } catch (IOException ie) { assertTrue("UnknownRegionException should be thrown", - ie instanceof UnknownRegionException); + ie instanceof UnknownRegionException + || StringUtils.stringifyException(ie).contains("Invalid regionName format")); } table.close(); } finally { @@ -378,8 +379,8 @@ public class TestRegionMergeTransactionOnCluster { HRegionInfo regionA = tableRegions.get(regionAnum).getFirst(); HRegionInfo regionB = tableRegions.get(regionBnum).getFirst(); TEST_UTIL.getHBaseAdmin().mergeRegions( - regionA.getEncodedNameAsBytes(), - regionB.getEncodedNameAsBytes(), false); + regionA.getRegionName(), + regionB.getRegionName(), false); return new PairOfSameType(regionA, regionB); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java index dbf2f0d..ffd6f0f 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java @@ -311,10 +311,10 @@ public class TestFlushSnapshotFromClient { int numRegions = admin.getTableRegions(TABLE_NAME).size(); int numRegionsAfterMerge = numRegions - 2; - admin.mergeRegions(regions.get(1).getEncodedNameAsBytes(), - regions.get(2).getEncodedNameAsBytes(), true); - admin.mergeRegions(regions.get(5).getEncodedNameAsBytes(), - regions.get(6).getEncodedNameAsBytes(), true); + admin.mergeRegions(regions.get(1).getRegionName(), + regions.get(2).getRegionName(), true); + admin.mergeRegions(regions.get(5).getRegionName(), + regions.get(6).getRegionName(), true); // Verify that there's one region less waitRegionsAfterMerge(numRegionsAfterMerge); @@ -353,10 +353,10 @@ public class TestFlushSnapshotFromClient { int numRegions = admin.getTableRegions(TABLE_NAME).size(); int numRegionsAfterMerge = numRegions - 2; - admin.mergeRegions(regions.get(1).getEncodedNameAsBytes(), - regions.get(2).getEncodedNameAsBytes(), true); - admin.mergeRegions(regions.get(5).getEncodedNameAsBytes(), - regions.get(6).getEncodedNameAsBytes(), true); + admin.mergeRegions(regions.get(1).getRegionName(), + regions.get(2).getRegionName(), true); + admin.mergeRegions(regions.get(5).getRegionName(), + regions.get(6).getRegionName(), true); waitRegionsAfterMerge(numRegionsAfterMerge); assertEquals(numRegionsAfterMerge, admin.getTableRegions(TABLE_NAME).size()); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsckOneRS.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsckOneRS.java index c1c49e2..013531d 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsckOneRS.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestHBaseFsckOneRS.java @@ -595,7 +595,7 @@ public class TestHBaseFsckOneRS extends BaseTestHBaseFsck { assertNotEquals(region1, region2); // do a region merge - admin.mergeRegions(region1.getEncodedNameAsBytes(), region2.getEncodedNameAsBytes(), false); + admin.mergeRegions(region1.getRegionName(), region2.getRegionName(), false); // wait until region merged long timeout = System.currentTimeMillis() + 30 * 1000; -- 2.4.9 (Apple Git-60)