diff --git a/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java b/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java index 06621ab..4a73b53 100644 --- a/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java +++ b/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java @@ -28,6 +28,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.Iterator; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; @@ -44,6 +45,7 @@ import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HServerAddress; +import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.Delete; @@ -66,6 +68,8 @@ import org.apache.hadoop.hbase.thrift.generated.IllegalArgument; 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.TServerAddress; +import org.apache.hadoop.hbase.thrift.generated.TRegionLocation; import org.apache.hadoop.hbase.thrift.generated.TRowResult; import org.apache.hadoop.hbase.util.Bytes; import org.apache.thrift.TException; @@ -254,22 +258,58 @@ public class ThriftServer { public List getTableRegions(byte[] tableName) throws IOError { - try{ + Map m = this.getRegionsInfo(tableName); + return new ArrayList(m.keySet()); + } + + public Map getRegionsInfo(byte[] tableName) + throws IOError { + try { HTable table = getTable(tableName); Map regionsInfo = table.getRegionsInfo(); - List regions = new ArrayList(); - - for (HRegionInfo regionInfo : regionsInfo.keySet()){ - TRegionInfo region = new TRegionInfo(); - region.startKey = regionInfo.getStartKey(); - region.endKey = regionInfo.getEndKey(); - region.id = regionInfo.getRegionId(); - region.name = regionInfo.getRegionName(); - region.version = regionInfo.getVersion(); - regions.add(region); + Map m = new HashMap(); + + for (Iterator it = regionsInfo.entrySet().iterator(); it.hasNext();) { + Map.Entry entry = (Map.Entry)it.next(); + HRegionInfo regionInfo = (HRegionInfo)entry.getKey(); + HServerAddress addrInfo = (HServerAddress)entry.getValue(); + + TRegionInfo region = new TRegionInfo( + regionInfo.getStartKey(), + regionInfo.getEndKey(), + regionInfo.getRegionId(), + regionInfo.getRegionName(), + regionInfo.getVersion()); + TServerAddress addr = new TServerAddress( + Bytes.toBytes(addrInfo.getHostname()), + addrInfo.getPort()); + m.put(region, addr); } - return regions; - } catch (IOException e){ + return m; + } catch (IOException e) { + throw new IOError(e.getMessage()); + } + } + + public TRegionLocation getRegionLocation(byte[] tableName, byte[] row) + throws IOError { + try { + HTable table = getTable(tableName); + HRegionLocation regionLocation = table.getRegionLocation(row); + HRegionInfo regionInfo = regionLocation.getRegionInfo(); + HServerAddress addrInfo = regionLocation.getServerAddress(); + + TRegionInfo region = new TRegionInfo( + regionInfo.getStartKey(), + regionInfo.getEndKey(), + regionInfo.getRegionId(), + regionInfo.getRegionName(), + regionInfo.getVersion()); + TServerAddress addr = new TServerAddress( + Bytes.toBytes(addrInfo.getHostname()), + addrInfo.getPort()); + return new TRegionLocation(region, addr); + } catch (IOException e) { throw new IOError(e.getMessage()); } } diff --git a/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift b/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift index 57c7744..001efaa 100644 --- a/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift +++ b/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift @@ -90,6 +90,22 @@ struct TRegionInfo { } /** + * A HServerAddress contains host and port number information. + */ +struct TServerAddress { + 1:Text host, + 2:i32 port +} + +/** + * A TRegionLocation contains TRegionInfo and TServerAddress. + */ +struct TRegionLocation { + 1:TRegionInfo regionInfo, + 2:TServerAddress serverAddress +} + +/** * A Mutation object is used to either update or delete a column-value. */ struct Mutation { @@ -209,6 +225,28 @@ service Hbase { throws (1:IOError io) /** + * Get all the regions and their address for a specified table. + * + * @return A map of TRegionInfo with its server address + */ + map getRegionsInfo( + /** table name */ + 1:Text tableName) + throws (1:IOError io) + + /** + * Find the region on which given row is being served. + * + * @return Location of the row. + */ + TRegionLocation getRegionLocation( + /** table name */ + 1:Text tableName, + /** row key */ + 2:Text row) + throws (1:IOError io) + + /** * Create a table with the specified column families. The name * field for each ColumnDescriptor must be set and must end in a * colon (:). All other fields are optional and will get default