HBASE-1669 need dynamic extensibility of HBaseRPC code maps and interface lists
git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@795290 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
c3921a955d
commit
8809929dff
|
@ -274,6 +274,8 @@ Release 0.20.0 - Unreleased
|
||||||
HBASE-1058 Disable 1058 on catalog tables
|
HBASE-1058 Disable 1058 on catalog tables
|
||||||
HBASE-1583 Start/Stop of large cluster untenable
|
HBASE-1583 Start/Stop of large cluster untenable
|
||||||
HBASE-1668 hbase-1609 broke TestHRegion.testScanSplitOnRegion unit test
|
HBASE-1668 hbase-1609 broke TestHRegion.testScanSplitOnRegion unit test
|
||||||
|
HBASE-1669 need dynamic extensibility of HBaseRPC code maps and interface
|
||||||
|
lists (Clint Morgan via Stack)
|
||||||
|
|
||||||
IMPROVEMENTS
|
IMPROVEMENTS
|
||||||
HBASE-1089 Add count of regions on filesystem to master UI; add percentage
|
HBASE-1089 Add count of regions on filesystem to master UI; add percentage
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.apache.hadoop.hbase.client.ResultScanner;
|
||||||
import org.apache.hadoop.hbase.client.Scan;
|
import org.apache.hadoop.hbase.client.Scan;
|
||||||
import org.apache.hadoop.hbase.client.ScannerCallable;
|
import org.apache.hadoop.hbase.client.ScannerCallable;
|
||||||
import org.apache.hadoop.hbase.client.ServerCallable;
|
import org.apache.hadoop.hbase.client.ServerCallable;
|
||||||
|
import org.apache.hadoop.hbase.ipc.HBaseRPC;
|
||||||
import org.apache.hadoop.hbase.ipc.TransactionalRegionInterface;
|
import org.apache.hadoop.hbase.ipc.TransactionalRegionInterface;
|
||||||
import org.apache.hadoop.hbase.util.Bytes;
|
import org.apache.hadoop.hbase.util.Bytes;
|
||||||
|
|
||||||
|
@ -41,6 +42,11 @@ import org.apache.hadoop.hbase.util.Bytes;
|
||||||
*/
|
*/
|
||||||
public class TransactionalTable extends HTable {
|
public class TransactionalTable extends HTable {
|
||||||
|
|
||||||
|
private static final byte RPC_CODE = 100;
|
||||||
|
static {
|
||||||
|
HBaseRPC.addToMap(TransactionalRegionInterface.class, RPC_CODE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param conf
|
* @param conf
|
||||||
* @param tableName
|
* @param tableName
|
||||||
|
|
|
@ -84,24 +84,53 @@ public class HBaseRPC {
|
||||||
super();
|
super();
|
||||||
} // no public ctor
|
} // no public ctor
|
||||||
|
|
||||||
|
// Special code that means 'not-encoded'.
|
||||||
|
private static final byte NOT_ENCODED = 0;
|
||||||
|
private static byte code = NOT_ENCODED + 1;
|
||||||
|
|
||||||
|
/** Add a new interface to the ipc map.
|
||||||
|
* @param c Class whose methods we'll add to the map of methods to codes
|
||||||
|
* (and vice versa).
|
||||||
|
* @param startCode Current state of the byte code.
|
||||||
|
* @return State of <code>code</code> when this method is done.
|
||||||
|
*/
|
||||||
|
public static byte addToMap(final Class<?> c, final byte startCode) {
|
||||||
|
if (Invocation.CODE_TO_METHODNAME.get(startCode) != null) {
|
||||||
|
throw new IllegalArgumentException("Code " + startCode +
|
||||||
|
"already had entry");
|
||||||
|
}
|
||||||
|
byte localCode = startCode;
|
||||||
|
Method [] methods = c.getMethods();
|
||||||
|
// There are no guarantees about the order in which items are returned in
|
||||||
|
// so do a sort (Was seeing that sort was one way on one server and then
|
||||||
|
// another on different server).
|
||||||
|
Arrays.sort(methods, new Comparator<Method>() {
|
||||||
|
public int compare(Method left, Method right) {
|
||||||
|
return left.getName().compareTo(right.getName());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for (int i = 0; i < methods.length; i++) {
|
||||||
|
Invocation.addToMap(methods[i].getName(), localCode++);
|
||||||
|
}
|
||||||
|
return localCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
code = HBaseRPC.addToMap(VersionedProtocol.class, code);
|
||||||
|
code = HBaseRPC.addToMap(HMasterInterface.class, code);
|
||||||
|
code = HBaseRPC.addToMap(HMasterRegionInterface.class, code);
|
||||||
|
code = HBaseRPC.addToMap(HRegionInterface.class, code);
|
||||||
|
}
|
||||||
|
|
||||||
/** A method invocation, including the method name and its parameters.*/
|
/** A method invocation, including the method name and its parameters.*/
|
||||||
private static class Invocation implements Writable, Configurable {
|
private static class Invocation implements Writable, Configurable {
|
||||||
// Here, for hbase, we maintain two static maps of method names to code and
|
// Here, for hbase, we maintain two static maps of method names to code and
|
||||||
// vice versa.
|
// vice versa.
|
||||||
private static final Map<Byte, String> CODE_TO_METHODNAME =
|
static final Map<Byte, String> CODE_TO_METHODNAME =
|
||||||
new HashMap<Byte, String>();
|
new HashMap<Byte, String>();
|
||||||
private static final Map<String, Byte> METHODNAME_TO_CODE =
|
private static final Map<String, Byte> METHODNAME_TO_CODE =
|
||||||
new HashMap<String, Byte>();
|
new HashMap<String, Byte>();
|
||||||
// Special code that means 'not-encoded'.
|
|
||||||
private static final byte NOT_ENCODED = 0;
|
|
||||||
static {
|
|
||||||
byte code = NOT_ENCODED + 1;
|
|
||||||
code = addToMap(VersionedProtocol.class, code);
|
|
||||||
code = addToMap(HMasterInterface.class, code);
|
|
||||||
code = addToMap(HMasterRegionInterface.class, code);
|
|
||||||
code = addToMap(HRegionInterface.class, code);
|
|
||||||
}
|
|
||||||
// End of hbase modifications.
|
// End of hbase modifications.
|
||||||
|
|
||||||
private String methodName;
|
private String methodName;
|
||||||
|
@ -180,7 +209,7 @@ public class HBaseRPC {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hbase additions.
|
// Hbase additions.
|
||||||
private static void addToMap(final String name, final byte code) {
|
static void addToMap(final String name, final byte code) {
|
||||||
if (METHODNAME_TO_CODE.containsKey(name)) {
|
if (METHODNAME_TO_CODE.containsKey(name)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -188,28 +217,6 @@ public class HBaseRPC {
|
||||||
CODE_TO_METHODNAME.put(Byte.valueOf(code), name);
|
CODE_TO_METHODNAME.put(Byte.valueOf(code), name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* @param c Class whose methods we'll add to the map of methods to codes
|
|
||||||
* (and vice versa).
|
|
||||||
* @param code Current state of the byte code.
|
|
||||||
* @return State of <code>code</code> when this method is done.
|
|
||||||
*/
|
|
||||||
private static byte addToMap(final Class<?> c, final byte code) {
|
|
||||||
byte localCode = code;
|
|
||||||
Method [] methods = c.getMethods();
|
|
||||||
// There are no guarantees about the order in which items are returned in
|
|
||||||
// so do a sort (Was seeing that sort was one way on one server and then
|
|
||||||
// another on different server).
|
|
||||||
Arrays.sort(methods, new Comparator<Method>() {
|
|
||||||
public int compare(Method left, Method right) {
|
|
||||||
return left.getName().compareTo(right.getName());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
for (int i = 0; i < methods.length; i++) {
|
|
||||||
addToMap(methods[i].getName(), localCode++);
|
|
||||||
}
|
|
||||||
return localCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write out the code byte for passed Class.
|
* Write out the code byte for passed Class.
|
||||||
|
|
Loading…
Reference in New Issue