Index: src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java (revision 1129960) +++ src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java (working copy) @@ -66,6 +66,7 @@ doTestTableMutations(); doTestTableTimestampsAndColumns(); doTestTableScanners(); + doTestGetTableRegions(); } /** @@ -98,7 +99,8 @@ handler.disableTable(tableAname);*/ handler.deleteTable(tableAname); } - + + /** * Tests adding a series of Mutations and BatchMutations, including a * delete mutation. Also tests data retrieval, and getting back multiple @@ -310,8 +312,29 @@ handler.deleteTable(tableAname); } + /** + * For HBASE-2556 + * Tests for GetTableRegions * + * @throws Exception + */ + public void doTestGetTableRegions() throws Exception { + ThriftServer.HBaseHandler handler = new ThriftServer.HBaseHandler(this.conf); + + handler.createTable(tableAname, getColumnDescriptors()); + int RegionCount = handler.getTableRegions(tableAname).size(); + assertEquals("empty table should have only 1 region, " + + "but found " + RegionCount, RegionCount, 1); + handler.disableTable(tableAname); + handler.deleteTable(tableAname); + RegionCount = handler.getTableRegions(tableAname).size(); + assertEquals("non-existing table should have 0 region, " + + "but found " + RegionCount, RegionCount, 0); + } + + /** + * * @return a List of ColumnDescriptors for use in creating a table. Has one * default ColumnDescriptor and one ColumnDescriptor with fewer versions */ Index: src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java (revision 1129960) +++ src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java (working copy) @@ -830,4 +830,35 @@ this.admin.deleteTable(tableName); } } -} \ No newline at end of file + + + /** + * For HBASE-2556 + * @throws IOException + */ + @Test + public void testGetTableRegions() throws IOException { + + byte[] tableName = Bytes.toBytes("testGetTableRegions"); + + int expectedRegions = 10; + + // Use 80 bit numbers to make sure we aren't limited + byte [] startKey = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + byte [] endKey = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; + + + HTableDescriptor desc = new HTableDescriptor(tableName); + desc.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY)); + admin = new HBaseAdmin(TEST_UTIL.getConfiguration()); + admin.createTable(desc, startKey, endKey, expectedRegions); + + List RegionInfos = admin.getTableRegions(tableName); + + assertEquals("Tried to create " + expectedRegions + " regions " + + "but only found " + RegionInfos.size(), + expectedRegions, RegionInfos.size()); + + } + +} Index: src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java (revision 1129960) +++ src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java (working copy) @@ -269,11 +269,10 @@ public List getTableRegions(ByteBuffer tableName) throws IOError { try{ - HTable table = getTable(tableName); - Map regionsInfo = table.getRegionsInfo(); + List HRegions = this.admin.getTableRegions(tableName.array()); List regions = new ArrayList(); - for (HRegionInfo regionInfo : regionsInfo.keySet()){ + for (HRegionInfo regionInfo : HRegions){ TRegionInfo region = new TRegionInfo(); region.startKey = ByteBuffer.wrap(regionInfo.getStartKey()); region.endKey = ByteBuffer.wrap(regionInfo.getEndKey()); Index: src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java (revision 1129960) +++ src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java (working copy) @@ -21,8 +21,10 @@ import java.io.Closeable; import java.io.IOException; +import java.nio.ByteBuffer; import java.util.Arrays; import java.util.List; +import java.util.ArrayList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -1240,6 +1242,27 @@ new HBaseAdmin(copyOfConf); } + /** + * get the regions of a given table. + * + * @param tableName the name of the table + * @return Ordered list of {@link HRegionInfo}. * + * @throws IOException + */ + public List getTableRegions(final byte[] tableName) throws IOException + { + CatalogTracker ct = getCatalogTracker(); + List Regions; + try { + Regions = MetaReader.getTableRegions(ct, tableName, true); + } finally { + cleanupCatalogTracker(ct); + } + + return Regions; + } + + public void close() throws IOException { if (this.connection != null) { this.connection.close();