From b298270b99fbb0ee392e0e5c0dd6a64119f0bdc8 Mon Sep 17 00:00:00 2001 From: "terence.yoo" Date: Wed, 18 Nov 2015 01:15:01 +0900 Subject: [PATCH] HBaseAdmin.mergeRegions should accept full or encoded region names --- .../java/org/apache/hadoop/hbase/client/Admin.java | 6 ++--- .../org/apache/hadoop/hbase/client/HBaseAdmin.java | 29 +++++++++++++++++----- .../org/apache/hadoop/hbase/client/TestAdmin1.java | 24 ++++++++++++++++++ 3 files changed, 50 insertions(+), 9 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..290ecb5 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 encoded or full name of region a + * @param nameOfRegionB encoded or full 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..ace55c1 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 @@ -2267,22 +2267,39 @@ public class HBaseAdmin implements Admin { }); } + private boolean isEncodedRegionName(byte[] regionName) throws IOException { + try { + HRegionInfo.parseRegionName(regionName); + return false; + } catch (IOException e) { + if (StringUtils.stringifyException(e).contains("Invalid regionName format")) + return true; + else + throw e; + } + } + /** * Merge two regions. Asynchronous operation. - * @param encodedNameOfRegionA encoded name of region a - * @param encodedNameOfRegionB encoded name of region b + * @param nameOfRegionA encoded or full name of region a + * @param nameOfRegionB encoded or full 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); + final byte[] encodedNameOfRegionA = isEncodedRegionName(nameOfRegionA) ? + nameOfRegionA : HRegionInfo.encodeRegionName(nameOfRegionA).getBytes(); + final byte[] encodedNameOfRegionB = isEncodedRegionName(nameOfRegionB) ? + nameOfRegionB : HRegionInfo.encodeRegionName(nameOfRegionB).getBytes(); + + 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()) { 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..c1a9509 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 @@ -1393,4 +1393,28 @@ public class TestAdmin1 { } } } + + @Test + public void testMergeRegions() throws Exception { + TableName tableName = TableName.valueOf("testMergeWithFullRegionName"); + HColumnDescriptor cd = new HColumnDescriptor("d"); + HTableDescriptor td = new HTableDescriptor(tableName); + td.addFamily(cd); + byte[][] splitRows = new byte[3][]; + splitRows[0] = new byte[]{(byte)'3'}; + splitRows[1] = new byte[]{(byte)'6'}; + splitRows[2] = new byte[]{(byte)'9'}; + Table table = TEST_UTIL.createTable(td, splitRows); + TEST_UTIL.waitTableAvailable(tableName); + List tableRegions = admin.getTableRegions(tableName); + assertEquals(4, tableRegions.size()); + + // merge with full name + admin.mergeRegions(tableRegions.get(0).getRegionName(), + tableRegions.get(1).getRegionName(), false); + + // merge with encoded name + admin.mergeRegions(tableRegions.get(2).getEncodedNameAsBytes(), + tableRegions.get(3).getEncodedNameAsBytes(), false); + } } -- 2.4.9 (Apple Git-60)