You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2012/01/16 14:10:11 UTC

svn commit: r1231986 - in /hbase/branches/0.92: CHANGES.txt src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java src/main/java/org/apache/hadoop/hbase/ipc/HBaseServer.java src/main/java/org/apache/hadoop/hbase/ipc/Invocation.java

Author: stack
Date: Mon Jan 16 13:10:11 2012
New Revision: 1231986

URL: http://svn.apache.org/viewvc?rev=1231986&view=rev
Log:
HBASE-5204 Backward compatibility fixes for 0.92

Modified:
    hbase/branches/0.92/CHANGES.txt
    hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java
    hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/ipc/HBaseServer.java
    hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/ipc/Invocation.java

Modified: hbase/branches/0.92/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/branches/0.92/CHANGES.txt?rev=1231986&r1=1231985&r2=1231986&view=diff
==============================================================================
--- hbase/branches/0.92/CHANGES.txt (original)
+++ hbase/branches/0.92/CHANGES.txt Mon Jan 16 13:10:11 2012
@@ -521,6 +521,7 @@ Release 0.92.0 - Unreleased
                ("The directory is already locked.") (N Keywal)
    HBASE-5143  Fix config typo in pluggable load balancer factory (Harsh J)
    HBASE-5196  Failure in region split after PONR could cause region hole (Jimmy Xiang)
+   HBASE-5204  Backward compatibility fixes for 0.92 (Benoît Sigoure)
 
   TESTS
    HBASE-4492  TestRollingRestart fails intermittently

Modified: hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java?rev=1231986&r1=1231985&r2=1231986&view=diff
==============================================================================
--- hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java (original)
+++ hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java Mon Jan 16 13:10:11 2012
@@ -121,6 +121,14 @@ public class HbaseObjectWritable impleme
   // 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++);
@@ -163,7 +171,6 @@ public class HbaseObjectWritable impleme
     addToMap(HServerAddress.class, code++);
     addToMap(HServerInfo.class, code++);
     addToMap(HTableDescriptor.class, code++);
-    addToMap(HTableDescriptor[].class, code++);
     addToMap(MapWritable.class, code++);
 
     //
@@ -220,7 +227,7 @@ public class HbaseObjectWritable impleme
     addToMap(Increment.class, code++);
 
     addToMap(KeyOnlyFilter.class, code++);
-    
+
     // serializable
     addToMap(Serializable.class, code++);
 
@@ -231,9 +238,10 @@ public class HbaseObjectWritable impleme
     addToMap(ColumnRangeFilter.class, code++);
 
     addToMap(HServerLoad.class, code++);
-    
+
     addToMap(RegionOpeningState.class, code++);
-    
+
+    addToMap(HTableDescriptor[].class, code++);
   }
 
   private Class<?> declaredClass;
@@ -588,7 +596,7 @@ public class HbaseObjectWritable impleme
         in.readFully(objectBytes);
         ByteArrayInputStream bis = null;
         ObjectInputStream ois = null;
-        try { 
+        try {
           bis = new ByteArrayInputStream(objectBytes);
           ois = new ObjectInputStream(bis);
           instance = ois.readObject();

Modified: hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/ipc/HBaseServer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/ipc/HBaseServer.java?rev=1231986&r1=1231985&r2=1231986&view=diff
==============================================================================
--- hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/ipc/HBaseServer.java (original)
+++ hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/ipc/HBaseServer.java Mon Jan 16 13:10:11 2012
@@ -1213,9 +1213,10 @@ public abstract class HBaseServer implem
       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());
       }

Modified: hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/ipc/Invocation.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/ipc/Invocation.java?rev=1231986&r1=1231985&r2=1231986&view=diff
==============================================================================
--- hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/ipc/Invocation.java (original)
+++ hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/ipc/Invocation.java Mon Jan 16 13:10:11 2012
@@ -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 Versione
   }
 
   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();