Author: stack
Date: Thu Apr 28 19:51:25 2011
New Revision: 1097587

URL: http://svn.apache.org/viewvc?rev=1097587&view=rev
Log:
HBASE-3827 hbase-1502, removing heartbeats, broke master joining a running 
cluster and was returning master hostname for rs to use

Modified:
    hbase/trunk/CHANGES.txt
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/ServerName.java
    
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
    
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
    
hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/RootRegionTracker.java

Modified: hbase/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1097587&r1=1097586&r2=1097587&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Thu Apr 28 19:51:25 2011
@@ -89,6 +89,8 @@ Release 0.91.0 - Unreleased
    HBASE-3819  TestSplitLogWorker has too many SLWs running -- makes for
                contention and occasional failures
    HBASE-3210  HBASE-1921 for the new master
+   HBASE-3827  hbase-1502, removing heartbeats, broke master joining a running
+               cluster and was returning master hostname for rs to use
 
   IMPROVEMENTS
    HBASE-3290  Max Compaction Size (Nicolas Spiegelberg via Stack)  

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/ServerName.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/ServerName.java?rev=1097587&r1=1097586&r2=1097587&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/ServerName.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/ServerName.java Thu Apr 
28 19:51:25 2011
@@ -211,11 +211,21 @@ public class ServerName implements Compa
   public static ServerName findServerWithSameHostnamePort(final 
Collection<ServerName> names,
       final ServerName serverName) {
     for (ServerName sn: names) {
-      if (sn.getHostname().equals(serverName.getHostname()) &&
-          sn.getPort() == serverName.getPort()) {
-        return sn;
-      }
+      if (isSameHostnameAndPort(serverName, sn)) return sn;
     }
     return null;
   }
+
+  /**
+   * @param left
+   * @param rigth
+   * @return True if <code>other</code> has same hostname and port.
+   */
+  public static boolean isSameHostnameAndPort(final ServerName left,
+      final ServerName right) {
+    if (left == null) return false;
+    if (right == null) return false;
+    return left.getHostname().equals(right.getHostname()) &&
+      left.getPort() == right.getPort();
+  }
 }
\ No newline at end of file

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java?rev=1097587&r1=1097586&r2=1097587&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java
 (original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java
 Thu Apr 28 19:51:25 2011
@@ -142,7 +142,7 @@ class ActiveMasterManager extends ZooKee
       byte [] bytes =
         ZKUtil.getDataAndWatch(this.watcher, this.watcher.masterAddressZNode);
       ServerName currentMaster = new ServerName(Bytes.toString(bytes));
-      if (currentMaster != null && currentMaster.equals(this.sn)) {
+      if (ServerName.isSameHostnameAndPort(currentMaster, this.sn)) {
         LOG.info("Current master has this master's address, " + currentMaster +
           "; master was restarted?  Waiting on znode to expire...");
         // Hurry along the expiration of the znode.
@@ -194,4 +194,4 @@ class ActiveMasterManager extends ZooKee
       LOG.error(this.watcher.prefix("Error deleting our own master address 
node"), e);
     }
   }
-}
\ No newline at end of file
+}

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java?rev=1097587&r1=1097586&r2=1097587&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java 
(original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java Thu 
Apr 28 19:51:25 2011
@@ -22,6 +22,7 @@ package org.apache.hadoop.hbase.master;
 import java.io.IOException;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -636,12 +637,13 @@ implements HMasterInterface, HMasterRegi
     final long serverStartCode, final long serverCurrentTime)
   throws IOException {
     // Register with server manager
-    this.serverManager.regionServerStartup(HBaseServer.getRemoteIp(), port,
+    InetAddress ia = HBaseServer.getRemoteIp();
+    ServerName rs = this.serverManager.regionServerStartup(ia, port,
       serverStartCode, serverCurrentTime);
     // Send back some config info
     MapWritable mw = createConfigurationSubset();
     mw.put(new Text(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER),
-      new Text(this.serverName.getHostname()));
+      new Text(rs.getHostname()));
     return mw;
   }
 
@@ -660,7 +662,7 @@ implements HMasterInterface, HMasterRegi
   }
 
   @Override
-  public void regionServerReport(byte[] sn, HServerLoad hsl)
+  public void regionServerReport(final byte [] sn, final HServerLoad hsl)
   throws IOException {
     this.serverManager.regionServerReport(new ServerName(sn), hsl);
     if (hsl != null && this.metrics != null) {

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java?rev=1097587&r1=1097586&r2=1097587&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java 
(original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java 
Thu Apr 28 19:51:25 2011
@@ -104,9 +104,10 @@ public class ServerManager {
    * @param port The remote port
    * @param serverStartcode
    * @param serverCurrentTime The current time of the region server in ms
+   * @return The ServerName we know this server as.
    * @throws IOException
    */
-  void regionServerStartup(final InetAddress ia, final int port,
+  ServerName regionServerStartup(final InetAddress ia, final int port,
     final long serverStartcode, long serverCurrentTime)
   throws IOException {
     // Test for case where we get a region startup message from a regionserver
@@ -121,6 +122,7 @@ public class ServerManager {
     checkIsDead(sn, "STARTUP");
     checkAlreadySameHostPort(sn);
     recordNewServer(sn, HServerLoad.EMPTY_HSERVERLOAD);
+    return sn;
   }
 
   void regionServerReport(ServerName sn, HServerLoad hsl)

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1097587&r1=1097586&r2=1097587&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
 (original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
 Thu Apr 28 19:51:25 2011
@@ -44,8 +44,6 @@ import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentSkipListSet;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -69,7 +67,6 @@ import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.MasterAddressTracker;
 import org.apache.hadoop.hbase.NotServingRegionException;
 import org.apache.hadoop.hbase.RemoteExceptionHandler;
-import org.apache.hadoop.hbase.Server;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.Stoppable;
 import org.apache.hadoop.hbase.UnknownRowLockException;

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/RootRegionTracker.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/RootRegionTracker.java?rev=1097587&r1=1097586&r2=1097587&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/RootRegionTracker.java
 (original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/zookeeper/RootRegionTracker.java
 Thu Apr 28 19:51:25 2011
@@ -22,6 +22,7 @@ package org.apache.hadoop.hbase.zookeepe
 import org.apache.hadoop.hbase.Abortable;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.catalog.RootLocationEditor;
+import org.apache.hadoop.hbase.util.Addressing;
 import org.apache.hadoop.hbase.util.Bytes;
 
 /**
@@ -57,8 +58,7 @@ public class RootRegionTracker extends Z
    * @throws InterruptedException 
    */
   public ServerName getRootRegionLocation() throws InterruptedException {
-    byte [] data = super.getData();
-    return data == null? null: new ServerName(dataToString(data));
+    return dataToServerName(super.getData());
   }
 
   /**
@@ -71,16 +71,28 @@ public class RootRegionTracker extends Z
    */
   public ServerName waitRootRegionLocation(long timeout)
   throws InterruptedException {
-    String str = dataToString(super.blockUntilAvailable(timeout));
-    return str == null? null: new ServerName(str);
+    return dataToServerName(super.blockUntilAvailable(timeout));
   }
 
   /*
    * @param data
    * @return Returns null if <code>data</code> is null else converts passed 
data
-   * to a String instance.
+   * to a ServerName instance.
    */
-  private static String dataToString(final byte [] data) {
-    return data == null ? null: Bytes.toString(data);
+  private static ServerName dataToServerName(final byte [] data) {
+    // The str returned could be old style -- pre hbase-1502 -- which was
+    // hostname and port seperated by a colon rather than hostname, port and
+    // startcode delimited by a ','.
+    if (data == null || data.length <= 0) return null;
+    String str = Bytes.toString(data);
+    int index = str.indexOf(ServerName.SERVERNAME_SEPARATOR);
+    if (index != -1) {
+      // Presume its ServerName.toString() format.
+      return new ServerName(str);
+    }
+    // Presume it a hostname:port format.
+    String hostname = Addressing.parseHostname(str);
+    int port = Addressing.parsePort(str);
+    return new ServerName(hostname, port, -1L);
   }
 }
\ No newline at end of file


Reply via email to