HBASE-4461 Expose getRowOrBefore via Thrift (jgray)
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1175220 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
d607687eb1
commit
62e8b5d61d
|
@ -3,6 +3,7 @@ Release 0.93.0 - Unreleased
|
|||
IMPROVEMENT
|
||||
HBASE-4132 Extend the WALActionsListener API to accomodate log archival
|
||||
(dhruba borthakur)
|
||||
HBASE-4461 Expose getRowOrBefore via Thrift (jgray)
|
||||
|
||||
Release 0.92.0 - Unreleased
|
||||
INCOMPATIBLE CHANGES
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
|
||||
package org.apache.hadoop.hbase.thrift;
|
||||
|
||||
import static org.apache.hadoop.hbase.util.Bytes.getBytes;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
|
@ -47,6 +49,7 @@ import org.apache.hadoop.hbase.HRegionInfo;
|
|||
import org.apache.hadoop.hbase.HServerAddress;
|
||||
import org.apache.hadoop.hbase.HTableDescriptor;
|
||||
import org.apache.hadoop.hbase.KeyValue;
|
||||
import org.apache.hadoop.hbase.ServerName;
|
||||
import org.apache.hadoop.hbase.client.Delete;
|
||||
import org.apache.hadoop.hbase.client.Get;
|
||||
import org.apache.hadoop.hbase.client.HBaseAdmin;
|
||||
|
@ -56,9 +59,9 @@ import org.apache.hadoop.hbase.client.Result;
|
|||
import org.apache.hadoop.hbase.client.ResultScanner;
|
||||
import org.apache.hadoop.hbase.client.Scan;
|
||||
import org.apache.hadoop.hbase.filter.Filter;
|
||||
import org.apache.hadoop.hbase.filter.ParseFilter;
|
||||
import org.apache.hadoop.hbase.filter.PrefixFilter;
|
||||
import org.apache.hadoop.hbase.filter.WhileMatchFilter;
|
||||
import org.apache.hadoop.hbase.filter.ParseFilter;
|
||||
import org.apache.hadoop.hbase.thrift.generated.AlreadyExists;
|
||||
import org.apache.hadoop.hbase.thrift.generated.BatchMutation;
|
||||
import org.apache.hadoop.hbase.thrift.generated.ColumnDescriptor;
|
||||
|
@ -72,6 +75,7 @@ import org.apache.hadoop.hbase.thrift.generated.TRowResult;
|
|||
import org.apache.hadoop.hbase.thrift.generated.TScan;
|
||||
import org.apache.hadoop.hbase.util.Bytes;
|
||||
import org.apache.hadoop.hbase.util.VersionInfo;
|
||||
import org.apache.hadoop.hbase.util.Writables;
|
||||
import org.apache.thrift.TException;
|
||||
import org.apache.thrift.protocol.TBinaryProtocol;
|
||||
import org.apache.thrift.protocol.TCompactProtocol;
|
||||
|
@ -87,8 +91,6 @@ import org.apache.thrift.transport.TServerSocket;
|
|||
import org.apache.thrift.transport.TServerTransport;
|
||||
import org.apache.thrift.transport.TTransportFactory;
|
||||
|
||||
import static org.apache.hadoop.hbase.util.Bytes.getBytes;
|
||||
|
||||
/**
|
||||
* ThriftServer - this class starts up a Thrift server which implements the
|
||||
* Hbase API specified in the Hbase.thrift IDL file.
|
||||
|
@ -897,6 +899,60 @@ public class ThriftServer {
|
|||
throw new IOError(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TCell> getRowOrBefore(ByteBuffer tableName, ByteBuffer row,
|
||||
ByteBuffer family) throws IOError {
|
||||
try {
|
||||
HTable table = getTable(getBytes(tableName));
|
||||
Result result = table.getRowOrBefore(getBytes(row), getBytes(family));
|
||||
return ThriftUtilities.cellFromHBase(result.sorted());
|
||||
} catch (IOException e) {
|
||||
throw new IOError(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TRegionInfo getRegionInfo(ByteBuffer searchRow) throws IOError {
|
||||
try {
|
||||
HTable table = getTable(HConstants.META_TABLE_NAME);
|
||||
Result startRowResult = table.getRowOrBefore(
|
||||
searchRow.array(), HConstants.CATALOG_FAMILY);
|
||||
|
||||
if (startRowResult == null) {
|
||||
throw new IOException("Cannot find row in .META., row="
|
||||
+ Bytes.toString(searchRow.array()));
|
||||
}
|
||||
|
||||
// find region start and end keys
|
||||
byte[] value = startRowResult.getValue(HConstants.CATALOG_FAMILY,
|
||||
HConstants.REGIONINFO_QUALIFIER);
|
||||
if (value == null || value.length == 0) {
|
||||
throw new IOException("HRegionInfo REGIONINFO was null or " +
|
||||
" empty in Meta for row="
|
||||
+ Bytes.toString(searchRow.array()));
|
||||
}
|
||||
HRegionInfo regionInfo = Writables.getHRegionInfo(value);
|
||||
TRegionInfo region = new TRegionInfo();
|
||||
region.setStartKey(regionInfo.getStartKey());
|
||||
region.setEndKey(regionInfo.getEndKey());
|
||||
region.id = regionInfo.getRegionId();
|
||||
region.setName(regionInfo.getRegionName());
|
||||
region.version = regionInfo.getVersion();
|
||||
|
||||
// find region assignment to server
|
||||
value = startRowResult.getValue(HConstants.CATALOG_FAMILY,
|
||||
HConstants.SERVER_QUALIFIER);
|
||||
if (value != null && value.length > 0) {
|
||||
ServerName sn = new ServerName(value);
|
||||
region.setServerName(Bytes.toBytes(sn.getHostname()));
|
||||
region.port = sn.getPort();
|
||||
}
|
||||
return region;
|
||||
} catch (IOException e) {
|
||||
throw new IOError(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -31,12 +31,16 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField("id", org.apache.thrift.protocol.TType.I64, (short)3);
|
||||
private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("name", org.apache.thrift.protocol.TType.STRING, (short)4);
|
||||
private static final org.apache.thrift.protocol.TField VERSION_FIELD_DESC = new org.apache.thrift.protocol.TField("version", org.apache.thrift.protocol.TType.BYTE, (short)5);
|
||||
private static final org.apache.thrift.protocol.TField SERVER_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("serverName", org.apache.thrift.protocol.TType.STRING, (short)6);
|
||||
private static final org.apache.thrift.protocol.TField PORT_FIELD_DESC = new org.apache.thrift.protocol.TField("port", org.apache.thrift.protocol.TType.I32, (short)7);
|
||||
|
||||
public ByteBuffer startKey; // required
|
||||
public ByteBuffer endKey; // required
|
||||
public long id; // required
|
||||
public ByteBuffer name; // required
|
||||
public byte version; // required
|
||||
public ByteBuffer serverName; // required
|
||||
public int port; // required
|
||||
|
||||
/** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
|
||||
public enum _Fields implements org.apache.thrift.TFieldIdEnum {
|
||||
|
@ -44,7 +48,9 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
END_KEY((short)2, "endKey"),
|
||||
ID((short)3, "id"),
|
||||
NAME((short)4, "name"),
|
||||
VERSION((short)5, "version");
|
||||
VERSION((short)5, "version"),
|
||||
SERVER_NAME((short)6, "serverName"),
|
||||
PORT((short)7, "port");
|
||||
|
||||
private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
|
||||
|
||||
|
@ -69,6 +75,10 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
return NAME;
|
||||
case 5: // VERSION
|
||||
return VERSION;
|
||||
case 6: // SERVER_NAME
|
||||
return SERVER_NAME;
|
||||
case 7: // PORT
|
||||
return PORT;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
@ -111,7 +121,8 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
// isset id assignments
|
||||
private static final int __ID_ISSET_ID = 0;
|
||||
private static final int __VERSION_ISSET_ID = 1;
|
||||
private BitSet __isset_bit_vector = new BitSet(2);
|
||||
private static final int __PORT_ISSET_ID = 2;
|
||||
private BitSet __isset_bit_vector = new BitSet(3);
|
||||
|
||||
public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
|
||||
static {
|
||||
|
@ -126,6 +137,10 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING , "Text")));
|
||||
tmpMap.put(_Fields.VERSION, new org.apache.thrift.meta_data.FieldMetaData("version", org.apache.thrift.TFieldRequirementType.DEFAULT,
|
||||
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BYTE)));
|
||||
tmpMap.put(_Fields.SERVER_NAME, new org.apache.thrift.meta_data.FieldMetaData("serverName", org.apache.thrift.TFieldRequirementType.DEFAULT,
|
||||
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING , "Text")));
|
||||
tmpMap.put(_Fields.PORT, new org.apache.thrift.meta_data.FieldMetaData("port", org.apache.thrift.TFieldRequirementType.DEFAULT,
|
||||
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
|
||||
metaDataMap = Collections.unmodifiableMap(tmpMap);
|
||||
org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(TRegionInfo.class, metaDataMap);
|
||||
}
|
||||
|
@ -138,7 +153,9 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
ByteBuffer endKey,
|
||||
long id,
|
||||
ByteBuffer name,
|
||||
byte version)
|
||||
byte version,
|
||||
ByteBuffer serverName,
|
||||
int port)
|
||||
{
|
||||
this();
|
||||
this.startKey = startKey;
|
||||
|
@ -148,6 +165,9 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
this.name = name;
|
||||
this.version = version;
|
||||
setVersionIsSet(true);
|
||||
this.serverName = serverName;
|
||||
this.port = port;
|
||||
setPortIsSet(true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -167,6 +187,10 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
this.name = other.name;
|
||||
}
|
||||
this.version = other.version;
|
||||
if (other.isSetServerName()) {
|
||||
this.serverName = other.serverName;
|
||||
}
|
||||
this.port = other.port;
|
||||
}
|
||||
|
||||
public TRegionInfo deepCopy() {
|
||||
|
@ -182,6 +206,9 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
this.name = null;
|
||||
setVersionIsSet(false);
|
||||
this.version = 0;
|
||||
this.serverName = null;
|
||||
setPortIsSet(false);
|
||||
this.port = 0;
|
||||
}
|
||||
|
||||
public byte[] getStartKey() {
|
||||
|
@ -332,6 +359,63 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
__isset_bit_vector.set(__VERSION_ISSET_ID, value);
|
||||
}
|
||||
|
||||
public byte[] getServerName() {
|
||||
setServerName(org.apache.thrift.TBaseHelper.rightSize(serverName));
|
||||
return serverName == null ? null : serverName.array();
|
||||
}
|
||||
|
||||
public ByteBuffer bufferForServerName() {
|
||||
return serverName;
|
||||
}
|
||||
|
||||
public TRegionInfo setServerName(byte[] serverName) {
|
||||
setServerName(serverName == null ? (ByteBuffer)null : ByteBuffer.wrap(serverName));
|
||||
return this;
|
||||
}
|
||||
|
||||
public TRegionInfo setServerName(ByteBuffer serverName) {
|
||||
this.serverName = serverName;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void unsetServerName() {
|
||||
this.serverName = null;
|
||||
}
|
||||
|
||||
/** Returns true if field serverName is set (has been assigned a value) and false otherwise */
|
||||
public boolean isSetServerName() {
|
||||
return this.serverName != null;
|
||||
}
|
||||
|
||||
public void setServerNameIsSet(boolean value) {
|
||||
if (!value) {
|
||||
this.serverName = null;
|
||||
}
|
||||
}
|
||||
|
||||
public int getPort() {
|
||||
return this.port;
|
||||
}
|
||||
|
||||
public TRegionInfo setPort(int port) {
|
||||
this.port = port;
|
||||
setPortIsSet(true);
|
||||
return this;
|
||||
}
|
||||
|
||||
public void unsetPort() {
|
||||
__isset_bit_vector.clear(__PORT_ISSET_ID);
|
||||
}
|
||||
|
||||
/** Returns true if field port is set (has been assigned a value) and false otherwise */
|
||||
public boolean isSetPort() {
|
||||
return __isset_bit_vector.get(__PORT_ISSET_ID);
|
||||
}
|
||||
|
||||
public void setPortIsSet(boolean value) {
|
||||
__isset_bit_vector.set(__PORT_ISSET_ID, value);
|
||||
}
|
||||
|
||||
public void setFieldValue(_Fields field, Object value) {
|
||||
switch (field) {
|
||||
case START_KEY:
|
||||
|
@ -374,6 +458,22 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
}
|
||||
break;
|
||||
|
||||
case SERVER_NAME:
|
||||
if (value == null) {
|
||||
unsetServerName();
|
||||
} else {
|
||||
setServerName((ByteBuffer)value);
|
||||
}
|
||||
break;
|
||||
|
||||
case PORT:
|
||||
if (value == null) {
|
||||
unsetPort();
|
||||
} else {
|
||||
setPort((Integer)value);
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -394,6 +494,12 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
case VERSION:
|
||||
return Byte.valueOf(getVersion());
|
||||
|
||||
case SERVER_NAME:
|
||||
return getServerName();
|
||||
|
||||
case PORT:
|
||||
return Integer.valueOf(getPort());
|
||||
|
||||
}
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
@ -415,6 +521,10 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
return isSetName();
|
||||
case VERSION:
|
||||
return isSetVersion();
|
||||
case SERVER_NAME:
|
||||
return isSetServerName();
|
||||
case PORT:
|
||||
return isSetPort();
|
||||
}
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
@ -477,6 +587,24 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
return false;
|
||||
}
|
||||
|
||||
boolean this_present_serverName = true && this.isSetServerName();
|
||||
boolean that_present_serverName = true && that.isSetServerName();
|
||||
if (this_present_serverName || that_present_serverName) {
|
||||
if (!(this_present_serverName && that_present_serverName))
|
||||
return false;
|
||||
if (!this.serverName.equals(that.serverName))
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean this_present_port = true;
|
||||
boolean that_present_port = true;
|
||||
if (this_present_port || that_present_port) {
|
||||
if (!(this_present_port && that_present_port))
|
||||
return false;
|
||||
if (this.port != that.port)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -543,6 +671,26 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
return lastComparison;
|
||||
}
|
||||
}
|
||||
lastComparison = Boolean.valueOf(isSetServerName()).compareTo(typedOther.isSetServerName());
|
||||
if (lastComparison != 0) {
|
||||
return lastComparison;
|
||||
}
|
||||
if (isSetServerName()) {
|
||||
lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.serverName, typedOther.serverName);
|
||||
if (lastComparison != 0) {
|
||||
return lastComparison;
|
||||
}
|
||||
}
|
||||
lastComparison = Boolean.valueOf(isSetPort()).compareTo(typedOther.isSetPort());
|
||||
if (lastComparison != 0) {
|
||||
return lastComparison;
|
||||
}
|
||||
if (isSetPort()) {
|
||||
lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.port, typedOther.port);
|
||||
if (lastComparison != 0) {
|
||||
return lastComparison;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -597,6 +745,21 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
|
||||
}
|
||||
break;
|
||||
case 6: // SERVER_NAME
|
||||
if (field.type == org.apache.thrift.protocol.TType.STRING) {
|
||||
this.serverName = iprot.readBinary();
|
||||
} else {
|
||||
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
|
||||
}
|
||||
break;
|
||||
case 7: // PORT
|
||||
if (field.type == org.apache.thrift.protocol.TType.I32) {
|
||||
this.port = iprot.readI32();
|
||||
setPortIsSet(true);
|
||||
} else {
|
||||
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
|
||||
}
|
||||
|
@ -633,6 +796,14 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
oprot.writeFieldBegin(VERSION_FIELD_DESC);
|
||||
oprot.writeByte(this.version);
|
||||
oprot.writeFieldEnd();
|
||||
if (this.serverName != null) {
|
||||
oprot.writeFieldBegin(SERVER_NAME_FIELD_DESC);
|
||||
oprot.writeBinary(this.serverName);
|
||||
oprot.writeFieldEnd();
|
||||
}
|
||||
oprot.writeFieldBegin(PORT_FIELD_DESC);
|
||||
oprot.writeI32(this.port);
|
||||
oprot.writeFieldEnd();
|
||||
oprot.writeFieldStop();
|
||||
oprot.writeStructEnd();
|
||||
}
|
||||
|
@ -673,6 +844,18 @@ public class TRegionInfo implements org.apache.thrift.TBase<TRegionInfo, TRegion
|
|||
sb.append("version:");
|
||||
sb.append(this.version);
|
||||
first = false;
|
||||
if (!first) sb.append(", ");
|
||||
sb.append("serverName:");
|
||||
if (this.serverName == null) {
|
||||
sb.append("null");
|
||||
} else {
|
||||
sb.append(this.serverName);
|
||||
}
|
||||
first = false;
|
||||
if (!first) sb.append(", ");
|
||||
sb.append("port:");
|
||||
sb.append(this.port);
|
||||
first = false;
|
||||
sb.append(")");
|
||||
return sb.toString();
|
||||
}
|
||||
|
|
|
@ -86,7 +86,9 @@ struct TRegionInfo {
|
|||
2:Text endKey,
|
||||
3:i64 id,
|
||||
4:Text name,
|
||||
5:byte version
|
||||
5:byte version,
|
||||
6:Text serverName,
|
||||
7:i32 port
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -778,4 +780,32 @@ service Hbase {
|
|||
/** id of a scanner returned by scannerOpen */
|
||||
1:ScannerID id
|
||||
) throws (1:IOError io, 2:IllegalArgument ia)
|
||||
|
||||
/**
|
||||
* Get the row just before the specified one.
|
||||
*
|
||||
* @return value for specified row/column
|
||||
*/
|
||||
list<TCell> getRowOrBefore(
|
||||
/** name of table */
|
||||
1:Text tableName,
|
||||
|
||||
/** row key */
|
||||
2:Text row,
|
||||
|
||||
/** column name */
|
||||
3:Text family
|
||||
) throws (1:IOError io)
|
||||
|
||||
/**
|
||||
* Get the regininfo for the specified row. It scans
|
||||
* the metatable to find region's start and end keys.
|
||||
*
|
||||
* @return value for specified row/column
|
||||
*/
|
||||
TRegionInfo getRegionInfo(
|
||||
/** row key */
|
||||
1:Text row,
|
||||
|
||||
) throws (1:IOError io)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue