HBASE-4784 Handle void return types in CoprocessorProtocol methods
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1202336 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
48c16d1d66
commit
3f423daca0
|
@ -428,6 +428,8 @@ Release 0.92.0 - Unreleased
|
|||
in the case of RS offline
|
||||
HBASE-4777 Write back to client 'incompatible' if we show up with wrong version
|
||||
HBASE-4775 Remove -ea from all but tests; enable it if you need it testing
|
||||
HBASE-4784 Void return types not handled correctly for CoprocessorProtocol
|
||||
methods
|
||||
|
||||
TESTS
|
||||
HBASE-4450 test for number of blocks read: to serve as baseline for expected
|
||||
|
|
|
@ -48,15 +48,13 @@ import java.io.Serializable;
|
|||
*/
|
||||
public class ExecResult implements Writable {
|
||||
private byte[] regionName;
|
||||
private Class<?> valueType;
|
||||
private Object value;
|
||||
|
||||
public ExecResult() {
|
||||
}
|
||||
|
||||
public ExecResult(byte[] region, Class<?> valueType, Object value) {
|
||||
public ExecResult(byte[] region, Object value) {
|
||||
this.regionName = region;
|
||||
this.valueType = valueType;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
@ -73,24 +71,11 @@ public class ExecResult implements Writable {
|
|||
Bytes.writeByteArray(out, regionName);
|
||||
HbaseObjectWritable.writeObject(out, value,
|
||||
value != null ? value.getClass() : Writable.class, null);
|
||||
Class<?> alternativeSerializationClass;
|
||||
if(value instanceof Writable){
|
||||
alternativeSerializationClass = Writable.class;
|
||||
} else {
|
||||
alternativeSerializationClass = Serializable.class;
|
||||
}
|
||||
out.writeUTF((valueType != null ? valueType : alternativeSerializationClass).getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFields(DataInput in) throws IOException {
|
||||
regionName = Bytes.readByteArray(in);
|
||||
value = HbaseObjectWritable.readObject(in, null);
|
||||
String className = in.readUTF();
|
||||
try {
|
||||
valueType = Classes.extendedForName(className);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException("Unable to find class of type: " + className );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4292,13 +4292,11 @@ public class HRegion implements HeapSize { // , Writable{
|
|||
|
||||
CoprocessorProtocol handler = protocolHandlers.getInstance(protocol);
|
||||
Object value;
|
||||
Class<?> returnType;
|
||||
|
||||
try {
|
||||
Method method = protocol.getMethod(
|
||||
call.getMethodName(), call.getParameterClasses());
|
||||
method.setAccessible(true);
|
||||
returnType = method.getReturnType();
|
||||
|
||||
value = method.invoke(handler, call.getParameters());
|
||||
} catch (InvocationTargetException e) {
|
||||
|
@ -4318,7 +4316,7 @@ public class HRegion implements HeapSize { // , Writable{
|
|||
throw ioe;
|
||||
}
|
||||
|
||||
return new ExecResult(getRegionName(), returnType, value);
|
||||
return new ExecResult(getRegionName(), value);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -54,6 +54,7 @@ public class TestServerCustomProtocol {
|
|||
public int getPingCount();
|
||||
public int incrementCount(int diff);
|
||||
public String hello(String name);
|
||||
public void noop();
|
||||
}
|
||||
|
||||
/* Test protocol implementation */
|
||||
|
@ -87,6 +88,11 @@ public class TestServerCustomProtocol {
|
|||
return "Hello, "+name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void noop() {
|
||||
// do nothing, just test void return type
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProtocolSignature getProtocolSignature(
|
||||
String protocol, long version, int clientMethodsHashCode)
|
||||
|
@ -324,6 +330,26 @@ public class TestServerCustomProtocol {
|
|||
verifyRegionResults(table, results, null, ROW_C);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testVoidReturnType() throws Throwable {
|
||||
HTable table = new HTable(util.getConfiguration(), TEST_TABLE);
|
||||
|
||||
Map<byte[],Object> results = table.coprocessorExec(PingProtocol.class,
|
||||
ROW_A, ROW_C,
|
||||
new Batch.Call<PingProtocol,Object>(){
|
||||
public Object call(PingProtocol instance) {
|
||||
instance.noop();
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
assertEquals("Should have results from three regions", 3, results.size());
|
||||
// all results should be null
|
||||
for (Object v : results.values()) {
|
||||
assertNull(v);
|
||||
}
|
||||
}
|
||||
|
||||
private void verifyRegionResults(HTable table,
|
||||
Map<byte[],String> results, byte[] row) throws Exception {
|
||||
verifyRegionResults(table, results, "pong", row);
|
||||
|
|
Loading…
Reference in New Issue