You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ji...@apache.org on 2008/11/12 00:09:25 UTC

svn commit: r713217 - in /hadoop/hbase/trunk: ./ src/java/org/apache/hadoop/hbase/client/ src/java/org/apache/hadoop/hbase/ipc/ src/java/org/apache/hadoop/hbase/master/ src/java/org/apache/hadoop/hbase/regionserver/ src/java/org/apache/hadoop/hbase/reg...

Author: jimk
Date: Tue Nov 11 15:09:23 2008
New Revision: 713217

URL: http://svn.apache.org/viewvc?rev=713217&view=rev
Log:
HBASE-994   IPC interfaces with different versions can cause problems

Added:
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HBaseRPCProtocolVersion.java
Modified:
    hadoop/hbase/trunk/CHANGES.txt
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterRegionInterface.java
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HRegionInterface.java
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/TransactionalRegionInterface.java
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/transactional/TransactionalRegionServer.java

Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=713217&r1=713216&r2=713217&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Tue Nov 11 15:09:23 2008
@@ -10,6 +10,7 @@
    HBASE-953   Enable BLOCKCACHE by default [WAS -> Reevaluate HBASE-288 block
                caching work....?] -- Update your hbad-default.xml file!
    HBASE-636   java6 as a requirement
+   HBASE-994   IPC interfaces with different versions can cause problems
 
   BUG FIXES
    HBASE-891   HRS.validateValuesLength throws IOE, gets caught in the retries

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java?rev=713217&r1=713216&r2=713217&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java Tue Nov 11 15:09:23 2008
@@ -47,6 +47,7 @@
 import org.apache.hadoop.hbase.io.BatchUpdate;
 import org.apache.hadoop.hbase.io.Cell;
 import org.apache.hadoop.hbase.io.RowResult;
+import org.apache.hadoop.hbase.ipc.HBaseRPCProtocolVersion;
 import org.apache.hadoop.hbase.ipc.HMasterInterface;
 import org.apache.hadoop.hbase.ipc.HRegionInterface;
 import org.apache.hadoop.hbase.ipc.HbaseRPC;
@@ -192,7 +193,7 @@
             DEFAULT_MASTER_ADDRESS));
           try {
             HMasterInterface tryMaster = (HMasterInterface)HbaseRPC.getProxy(
-                HMasterInterface.class, HMasterInterface.versionID, 
+                HMasterInterface.class, HBaseRPCProtocolVersion.versionID, 
                 masterLocation.getInetSocketAddress(), this.conf);
             
             if (tryMaster.isMasterRunning()) {
@@ -729,25 +730,10 @@
         // See if we already have a connection
         server = this.servers.get(regionServer.toString());
         if (server == null) { // Get a connection
-          long versionId = 0;
           try {
-            versionId =
-              serverInterfaceClass.getDeclaredField("versionID").getLong(server);
-          } catch (IllegalAccessException e) {
-            // Should never happen unless visibility of versionID changes
-            throw new UnsupportedOperationException(
-                "Unable to open a connection to a " +
-                serverInterfaceClass.getName() + " server.", e);
-          } catch (NoSuchFieldException e) {
-            // Should never happen unless versionID field name changes in HRegionInterface
-            throw new UnsupportedOperationException(
-                "Unable to open a connection to a " +
-                serverInterfaceClass.getName() + " server.", e);
-          }
-
-          try {
-            server = (HRegionInterface)HbaseRPC.waitForProxy(serverInterfaceClass,
-                versionId, regionServer.getInetSocketAddress(), this.conf, 
+            server = (HRegionInterface)HbaseRPC.waitForProxy(
+                serverInterfaceClass, HBaseRPCProtocolVersion.versionID,
+                regionServer.getInetSocketAddress(), this.conf, 
                 this.maxRPCAttempts);
           } catch (RemoteException e) {
             throw RemoteExceptionHandler.decodeRemoteException(e);

Added: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HBaseRPCProtocolVersion.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HBaseRPCProtocolVersion.java?rev=713217&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HBaseRPCProtocolVersion.java (added)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HBaseRPCProtocolVersion.java Tue Nov 11 15:09:23 2008
@@ -0,0 +1,67 @@
+/**
+ * Copyright 2008 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.ipc;
+
+import org.apache.hadoop.ipc.VersionedProtocol;
+
+/**
+ * There is one version id for all the RPC interfaces. If any interface
+ * is changed, the versionID must be changed here.
+ */
+public interface HBaseRPCProtocolVersion extends VersionedProtocol {
+  /**
+   * Interface version.
+   * 
+   * HMasterInterface version history:
+   * <ul>
+   * <li>Version was incremented to 2 when we brought the hadoop RPC local to
+   * hbase HADOOP-2495</li>
+   * <li>Version was incremented to 3 when we changed the RPC to send codes
+   * instead of actual class names (HADOOP-2519).</li>
+   * <li>Version 4 when we moved to all byte arrays (HBASE-42).</li>
+   * <li>Version 5  HBASE-576.</li>
+   * <li>Version 6  modifyTable.</li>
+   * </ul>
+   * <p>HMasterRegionInterface version history:
+   * <ul>
+   * <li>Version 2 was when the regionServerStartup was changed to return a
+   * MapWritable instead of a HbaseMapWritable as part of HBASE-82 changes.</li>
+   * <li>Version 3 was when HMsg was refactored so it could carry optional
+   * messages (HBASE-504).</li>
+   * <li>HBASE-576 we moved this to 4.</li>
+   * </ul>
+   * <p>HRegionInterface version history:
+   * <ul>
+   * <li>Upped to 5 when we added scanner caching</li>
+   * <li>HBASE-576, we moved this to 6.</li>
+   * </ul>
+   * <p>TransactionalRegionInterface version history:
+   * <ul>
+   * <li>Moved to 2 for hbase-576.</li>
+   * </ul>
+   * <p>Unified RPC version number history:
+   * <ul>
+   * <li>Version 10: initial version (had to be &gt all other RPC versions</li>
+   * </ul>
+   */
+  public static final long versionID = 10L;
+
+}

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java?rev=713217&r1=713216&r2=713217&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java Tue Nov 11 15:09:23 2008
@@ -25,24 +25,17 @@
 import org.apache.hadoop.hbase.HServerAddress;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.io.Writable;
-import org.apache.hadoop.ipc.VersionedProtocol;
 
 /**
  * Clients interact with the HMasterInterface to gain access to meta-level
  * HBase functionality, like finding an HRegionServer and creating/destroying
  * tables.
+ * 
+ * <p>NOTE: if you change the interface, you must change the RPC version
+ * number in HBaseRPCProtocolVersion
+ * 
  */
-public interface HMasterInterface extends VersionedProtocol {
-  /**
-   * Interface version.
-   * Version was incremented to 2 when we brought the hadoop RPC local to hbase
-   * -- HADOOP-2495 and then to 3 when we changed the RPC to send codes instead
-   * of actual class names (HADOOP-2519).
-   * <p>Version 4 when we moved to all byte arrays (HBASE-42).
-   * <p>Version 5  HBASE-576.
-   * <p>Version 6  modifyTable.
-   */
-  public static final long versionID = 6L;
+public interface HMasterInterface extends HBaseRPCProtocolVersion {
 
   /** @return true if master is available */
   public boolean isMasterRunning();

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterRegionInterface.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterRegionInterface.java?rev=713217&r1=713216&r2=713217&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterRegionInterface.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterRegionInterface.java Tue Nov 11 15:09:23 2008
@@ -22,7 +22,6 @@
 import java.io.IOException;
 
 import org.apache.hadoop.io.MapWritable;
-import org.apache.hadoop.ipc.VersionedProtocol;
 import org.apache.hadoop.hbase.HServerInfo;
 import org.apache.hadoop.hbase.HMsg;
 import org.apache.hadoop.hbase.HRegionInfo;
@@ -32,17 +31,12 @@
  * HRegionServers interact with the HMasterRegionInterface to report on local 
  * goings-on and to obtain data-handling instructions from the HMaster.
  * <p>Changes here need to be reflected in HbaseObjectWritable HbaseRPC#Invoker.
+ * 
+ * <p>NOTE: if you change the interface, you must change the RPC version
+ * number in HBaseRPCProtocolVersion
+ * 
  */
-public interface HMasterRegionInterface extends VersionedProtocol {
-  /**
-   * Interface version number.
-   * Version 2 was when the regionServerStartup was changed to return a
-   * MapWritable instead of a HbaseMapWritable as part of HBASE-82 changes.
-   * Version 3 was when HMsg was refactored so it could carry optional
-   * messages (HBASE-504).
-   * <p>HBASE-576 we moved this to 4.
-   */
-  public static final long versionID = 4L;
+public interface HMasterRegionInterface extends HBaseRPCProtocolVersion {
 
   /**
    * Called when a region server first starts

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HRegionInterface.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HRegionInterface.java?rev=713217&r1=713216&r2=713217&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HRegionInterface.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HRegionInterface.java Tue Nov 11 15:09:23 2008
@@ -26,20 +26,17 @@
 import org.apache.hadoop.hbase.io.Cell;
 import org.apache.hadoop.hbase.io.RowResult;
 
-import org.apache.hadoop.ipc.VersionedProtocol;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.NotServingRegionException;
 
 /**
  * Clients interact with HRegionServers using a handle to the HRegionInterface.
+ * 
+ * <p>NOTE: if you change the interface, you must change the RPC version
+ * number in HBaseRPCProtocolVersion
+ * 
  */
-public interface HRegionInterface extends VersionedProtocol {
-  /**
-   * Protocol version.
-   * Upped to 5 when we added scanner caching
-   * <p>HBASE-576, we moved this to 6.
-   */
-  public static final long versionID = 6L;
+public interface HRegionInterface extends HBaseRPCProtocolVersion {
 
   /** 
    * Get metainfo about an HRegion
@@ -113,6 +110,7 @@
    * @param regionName name of the region to update
    * @param b BatchUpdate[]
    * @throws IOException
+   * @return number of updates applied
    */
   public int batchUpdates(final byte[] regionName, final BatchUpdate[] b)
   throws IOException;

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/TransactionalRegionInterface.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/TransactionalRegionInterface.java?rev=713217&r1=713216&r2=713217&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/TransactionalRegionInterface.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/TransactionalRegionInterface.java Tue Nov 11 15:09:23 2008
@@ -27,12 +27,11 @@
 /**
  * Interface for transactional region servers.
  * 
+ * <p>NOTE: if you change the interface, you must change the RPC version
+ * number in HBaseRPCProtocolVersion
+ * 
  */
 public interface TransactionalRegionInterface extends HRegionInterface {
-  /** Interface version number
-   *  Moved to 2 for hbase-576.
-   */
-  public static final long versionID = 2L;
 
   /**
    * Sent to initiate a transaction.

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java?rev=713217&r1=713216&r2=713217&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java Tue Nov 11 15:09:23 2008
@@ -59,6 +59,7 @@
 import org.apache.hadoop.hbase.io.Cell;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.io.RowResult;
+import org.apache.hadoop.hbase.ipc.HBaseRPCProtocolVersion;
 import org.apache.hadoop.hbase.ipc.HMasterInterface;
 import org.apache.hadoop.hbase.ipc.HMasterRegionInterface;
 import org.apache.hadoop.hbase.ipc.HRegionInterface;
@@ -90,16 +91,9 @@
   
   static final Log LOG = LogFactory.getLog(HMaster.class.getName());
 
-  public long getProtocolVersion(String protocol,
-      @SuppressWarnings("unused") long clientVersion)
-  throws IOException {
-    if (protocol.equals(HMasterInterface.class.getName())) {
-      return HMasterInterface.versionID; 
-    } else if (protocol.equals(HMasterRegionInterface.class.getName())) {
-      return HMasterRegionInterface.versionID;
-    } else {
-      throw new IOException("Unknown protocol to name node: " + protocol);
-    }
+  public long getProtocolVersion(@SuppressWarnings("unused") String protocol,
+      @SuppressWarnings("unused") long clientVersion) {
+    return HBaseRPCProtocolVersion.versionID;
   }
 
   // We start out with closed flag on.  Using AtomicBoolean rather than

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=713217&r1=713216&r2=713217&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Tue Nov 11 15:09:23 2008
@@ -81,6 +81,7 @@
 import org.apache.hadoop.hbase.io.Cell;
 import org.apache.hadoop.hbase.io.HbaseMapWritable;
 import org.apache.hadoop.hbase.io.RowResult;
+import org.apache.hadoop.hbase.ipc.HBaseRPCProtocolVersion;
 import org.apache.hadoop.hbase.ipc.HMasterRegionInterface;
 import org.apache.hadoop.hbase.ipc.HRegionInterface;
 import org.apache.hadoop.hbase.ipc.HbaseRPC;
@@ -783,7 +784,7 @@
         // Do initial RPC setup.  The final argument indicates that the RPC
         // should retry indefinitely.
         master = (HMasterRegionInterface)HbaseRPC.waitForProxy(
-            HMasterRegionInterface.class, HMasterRegionInterface.versionID,
+            HMasterRegionInterface.class, HBaseRPCProtocolVersion.versionID,
             new HServerAddress(conf.get(MASTER_ADDRESS)).getInetSocketAddress(),
             this.conf, -1);
       } catch (IOException e) {
@@ -1072,7 +1073,7 @@
   private static class RegionCloserThread extends Thread {
     private final HRegion r;
 
-    public RegionCloserThread(final HRegion r) {
+    protected RegionCloserThread(final HRegion r) {
       super(Thread.currentThread().getName() + ".regionCloser." + r.toString());
       this.r = r;
     }
@@ -1790,7 +1791,7 @@
       @SuppressWarnings("unused") final long clientVersion)
   throws IOException {  
     if (protocol.equals(HRegionInterface.class.getName())) {
-      return HRegionInterface.versionID;
+      return HBaseRPCProtocolVersion.versionID;
     }
     throw new IOException("Unknown protocol to name node: " + protocol);
   }

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/transactional/TransactionalRegionServer.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/transactional/TransactionalRegionServer.java?rev=713217&r1=713216&r2=713217&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/transactional/TransactionalRegionServer.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/transactional/TransactionalRegionServer.java Tue Nov 11 15:09:23 2008
@@ -40,6 +40,7 @@
 import org.apache.hadoop.hbase.io.Cell;
 import org.apache.hadoop.hbase.io.HbaseMapWritable;
 import org.apache.hadoop.hbase.io.RowResult;
+import org.apache.hadoop.hbase.ipc.HBaseRPCProtocolVersion;
 import org.apache.hadoop.hbase.ipc.TransactionalRegionInterface;
 import org.apache.hadoop.hbase.regionserver.HRegion;
 import org.apache.hadoop.hbase.regionserver.HRegionServer;
@@ -86,7 +87,7 @@
   public long getProtocolVersion(final String protocol, final long clientVersion)
       throws IOException {
     if (protocol.equals(TransactionalRegionInterface.class.getName())) {
-      return TransactionalRegionInterface.versionID;
+      return HBaseRPCProtocolVersion.versionID;
     }
     return super.getProtocolVersion(protocol, clientVersion);
   }