diff --git src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java index dc509d9..d064290 100644 --- src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java +++ src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java @@ -27,6 +27,7 @@ import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -49,6 +50,8 @@ import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.TableNotFoundException; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; @@ -357,7 +360,7 @@ public class ThriftServerRunner implements Runnable { tserver.getClass().getName()); } - // login the server principal (if using secure Hadoop) + // login the server principal (if using secure Hadoop) if (User.isSecurityEnabled() && User.isHBaseSecurityEnabled(conf)) { String machineName = Strings.domainNamePointerToHostName( DNS.getDefaultHost(conf.get("hbase.thrift.dns.interface", "default"), @@ -383,7 +386,7 @@ public class ThriftServerRunner implements Runnable { String bindAddressStr = conf.get(BIND_CONF_KEY, DEFAULT_BIND_ADDR); return InetAddress.getByName(bindAddressStr); } - + /** * The HBaseHandler is a glue object that connects Thrift RPC calls to the * HBase client API primarily defined in the HBaseAdmin and HTable objects. @@ -568,23 +571,30 @@ public class ThriftServerRunner implements Runnable { @Override public List getTableRegions(ByteBuffer tableName) throws IOError { - try{ - List hris = - this.admin.getTableRegions(toBytes(tableName)); - List regions = new ArrayList(); - - if (hris != null) { - for (HRegionInfo regionInfo : hris){ - TRegionInfo region = new TRegionInfo(); - region.startKey = ByteBuffer.wrap(regionInfo.getStartKey()); - region.endKey = ByteBuffer.wrap(regionInfo.getEndKey()); - region.id = regionInfo.getRegionId(); - region.name = ByteBuffer.wrap(regionInfo.getRegionName()); - region.version = regionInfo.getVersion(); - regions.add(region); - } + try { + HTable table = getTable(tableName); + Map regionLocations = + table.getRegionLocations(); + List results = new ArrayList(); + for (Map.Entry entry : + regionLocations.entrySet()) { + HRegionInfo info = entry.getKey(); + ServerName serverName = entry.getValue(); + TRegionInfo region = new TRegionInfo(); + region.serverName = ByteBuffer.wrap( + Bytes.toBytes(serverName.getHostname())); + region.port = serverName.getPort(); + region.startKey = ByteBuffer.wrap(info.getStartKey()); + region.endKey = ByteBuffer.wrap(info.getEndKey()); + region.id = info.getRegionId(); + region.name = ByteBuffer.wrap(info.getRegionName()); + region.version = info.getVersion(); + results.add(region); } - return regions; + return results; + } catch (TableNotFoundException e) { + // Return empty list for non-existing table + return Collections.emptyList(); } catch (IOException e){ LOG.warn(e.getMessage(), e); throw new IOError(e.getMessage()); @@ -925,7 +935,7 @@ public class ThriftServerRunner implements Runnable { @Override public void mutateRow(ByteBuffer tableName, ByteBuffer row, - List mutations, Map attributes) + List mutations, Map attributes) throws IOError, IllegalArgument { mutateRowTs(tableName, row, mutations, HConstants.LATEST_TIMESTAMP, attributes); diff --git src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java index be81552..0cecbb9 100644 --- src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java +++ src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServer.java @@ -28,17 +28,19 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Collection; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.MediumTests; import org.apache.hadoop.hbase.filter.ParseFilter; -import org.junit.experimental.categories.Category; -import org.junit.Test; -import org.junit.BeforeClass; import org.apache.hadoop.hbase.thrift.generated.BatchMutation; import org.apache.hadoop.hbase.thrift.generated.ColumnDescriptor; import org.apache.hadoop.hbase.thrift.generated.Hbase; import org.apache.hadoop.hbase.thrift.generated.Mutation; import org.apache.hadoop.hbase.thrift.generated.TCell; +import org.apache.hadoop.hbase.thrift.generated.TRegionInfo; import org.apache.hadoop.hbase.thrift.generated.TRowResult; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.metrics.ContextFactory; @@ -47,9 +49,9 @@ import org.apache.hadoop.metrics.MetricsUtil; import org.apache.hadoop.metrics.spi.NoEmitMetricsContext; import org.apache.hadoop.metrics.spi.OutputRecord; import org.junit.AfterClass; -import org.apache.hadoop.hbase.MediumTests; -import org.apache.hadoop.hbase.HBaseTestingUtility; -import org.apache.hadoop.conf.Configuration; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.experimental.categories.Category; /** * Unit testing for ThriftServerRunner.HBaseHandler, a part of the @@ -58,6 +60,7 @@ import org.apache.hadoop.conf.Configuration; @Category(MediumTests.class) public class TestThriftServer { private static final HBaseTestingUtility UTIL = new HBaseTestingUtility(); + private static final Log LOG = LogFactory.getLog(TestThriftServer.class); protected static final int MAXVERSIONS = 3; private static ByteBuffer asByteBuffer(String i) { @@ -158,13 +161,13 @@ public class TestThriftServer { } private static void verifyMetrics(ThriftMetrics metrics, String name, int expectValue) - throws Exception { - MetricsContext context = MetricsUtil.getContext( - ThriftMetrics.CONTEXT_NAME); - metrics.doUpdates(context); - OutputRecord record = context.getAllRecords().get( - ThriftMetrics.CONTEXT_NAME).iterator().next(); - assertEquals(expectValue, record.getMetric(name).intValue()); + throws Exception { + MetricsContext context = MetricsUtil.getContext( + ThriftMetrics.CONTEXT_NAME); + metrics.doUpdates(context); + OutputRecord record = context.getAllRecords().get( + ThriftMetrics.CONTEXT_NAME).iterator().next(); + assertEquals(expectValue, record.getMetric(name).intValue()); } public static void createTestTables(Hbase.Iface handler) throws Exception { @@ -240,7 +243,7 @@ public class TestThriftServer { TRowResult rowResult2 = handler.getRow(tableAname, rowBname, null).get(0); assertEquals(rowBname, rowResult2.row); assertEquals(valueCname, rowResult2.columns.get(columnAname).value); - assertEquals(valueDname, rowResult2.columns.get(columnBname).value); + assertEquals(valueDname, rowResult2.columns.get(columnBname).value); // Apply some deletes handler.deleteAll(tableAname, rowAname, columnBname, null); @@ -428,26 +431,30 @@ public class TestThriftServer { public static void doTestGetTableRegions(Hbase.Iface handler) throws Exception { + assertEquals(handler.getTableNames().size(), 0); handler.createTable(tableAname, getColumnDescriptors()); - int regionCount = handler.getTableRegions(tableAname).size(); + assertEquals(handler.getTableNames().size(), 1); + List regions = handler.getTableRegions(tableAname); + int regionCount = regions.size(); assertEquals("empty table should have only 1 region, " + "but found " + regionCount, regionCount, 1); + LOG.info("Region found:" + regions.get(0)); handler.disableTable(tableAname); handler.deleteTable(tableAname); regionCount = handler.getTableRegions(tableAname).size(); assertEquals("non-existing table should have 0 region, " + "but found " + regionCount, regionCount, 0); } - + public void doTestFilterRegistration() throws Exception { Configuration conf = UTIL.getConfiguration(); - + conf.set("hbase.thrift.filters", "MyFilter:filterclass"); ThriftServerRunner.registerFilters(conf); - + Map registeredFilters = ParseFilter.getAllFilters(); - + assertEquals("filterclass", registeredFilters.get("MyFilter")); }