HBASE-5204 Backward compatibility fixes for 0.92
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1231985 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
323d17d3ae
commit
e20aa2b3a6
|
@ -123,6 +123,14 @@ public class HbaseObjectWritable implements Writable, WritableWithSize, Configur
|
|||
// sending of the class name using reflection, etc.
|
||||
private static final byte NOT_ENCODED = 0;
|
||||
static {
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// WARNING: Please do not insert, remove or swap any line in this static //
|
||||
// block. Doing so would change or shift all the codes used to serialize //
|
||||
// objects, which makes backwards compatibility very hard for clients. //
|
||||
// New codes should always be added at the end. Code removal is //
|
||||
// discouraged because code is a short now. //
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int code = NOT_ENCODED + 1;
|
||||
// Primitive types.
|
||||
addToMap(Boolean.TYPE, code++);
|
||||
|
@ -165,7 +173,6 @@ public class HbaseObjectWritable implements Writable, WritableWithSize, Configur
|
|||
addToMap(HServerAddress.class, code++);
|
||||
addToMap(HServerInfo.class, code++);
|
||||
addToMap(HTableDescriptor.class, code++);
|
||||
addToMap(HTableDescriptor[].class, code++);
|
||||
addToMap(MapWritable.class, code++);
|
||||
|
||||
//
|
||||
|
@ -236,6 +243,8 @@ public class HbaseObjectWritable implements Writable, WritableWithSize, Configur
|
|||
|
||||
addToMap(RegionOpeningState.class, code++);
|
||||
|
||||
addToMap(HTableDescriptor[].class, code++);
|
||||
|
||||
addToMap(Append.class, code++);
|
||||
|
||||
addToMap(RowMutation.class, code++);
|
||||
|
|
|
@ -1213,9 +1213,10 @@ public abstract class HBaseServer implements RpcServer {
|
|||
header.readFields(in);
|
||||
try {
|
||||
String protocolClassName = header.getProtocol();
|
||||
if (protocolClassName != null) {
|
||||
protocol = getProtocolClass(header.getProtocol(), conf);
|
||||
if (protocolClassName == null) {
|
||||
protocolClassName = "org.apache.hadoop.hbase.ipc.HRegionInterface";
|
||||
}
|
||||
protocol = getProtocolClass(protocolClassName, conf);
|
||||
} catch (ClassNotFoundException cnfe) {
|
||||
throw new IOException("Unknown protocol: " + header.getProtocol());
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ package org.apache.hadoop.hbase.ipc;
|
|||
import org.apache.hadoop.conf.Configurable;
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.hbase.io.HbaseObjectWritable;
|
||||
import org.apache.hadoop.io.VersionMismatchException;
|
||||
import org.apache.hadoop.io.VersionedWritable;
|
||||
|
||||
import java.io.DataInput;
|
||||
|
@ -94,10 +95,29 @@ public class Invocation extends VersionedWritable implements Configurable {
|
|||
}
|
||||
|
||||
public void readFields(DataInput in) throws IOException {
|
||||
super.readFields(in);
|
||||
methodName = in.readUTF();
|
||||
clientVersion = in.readLong();
|
||||
clientMethodsHash = in.readInt();
|
||||
try {
|
||||
super.readFields(in);
|
||||
methodName = in.readUTF();
|
||||
clientVersion = in.readLong();
|
||||
clientMethodsHash = in.readInt();
|
||||
} catch (VersionMismatchException e) {
|
||||
// VersionMismatchException doesn't provide an API to access
|
||||
// expectedVersion and foundVersion. This is really sad.
|
||||
if (e.toString().endsWith("found v0")) {
|
||||
// Try to be a bit backwards compatible. In previous versions of
|
||||
// HBase (before HBASE-3939 in 0.92) Invocation wasn't a
|
||||
// VersionedWritable and thus the first thing on the wire was always
|
||||
// the 2-byte length of the method name. Because no method name is
|
||||
// longer than 255 characters, and all method names are in ASCII,
|
||||
// The following code is equivalent to `in.readUTF()', which we can't
|
||||
// call again here, because `super.readFields(in)' already consumed
|
||||
// the first byte of input, which can't be "unread" back into `in'.
|
||||
final short len = (short) (in.readByte() & 0xFF); // Unsigned byte.
|
||||
final byte[] buf = new byte[len];
|
||||
in.readFully(buf, 0, len);
|
||||
methodName = new String(buf);
|
||||
}
|
||||
}
|
||||
parameters = new Object[in.readInt()];
|
||||
parameterClasses = new Class[parameters.length];
|
||||
HbaseObjectWritable objectWritable = new HbaseObjectWritable();
|
||||
|
|
Loading…
Reference in New Issue