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 2009/04/30 01:14:59 UTC

svn commit: r769989 - in /hadoop/hbase/trunk: ./ conf/ src/java/org/apache/hadoop/hbase/ src/java/org/apache/hadoop/hbase/regionserver/ src/test/ src/test/org/apache/hadoop/hbase/

Author: stack
Date: Wed Apr 29 23:14:57 2009
New Revision: 769989

URL: http://svn.apache.org/viewvc?rev=769989&view=rev
Log:
HBASE-1271 Allow multiple tests to run on one machine

Modified:
    hadoop/hbase/trunk/CHANGES.txt
    hadoop/hbase/trunk/conf/hbase-default.xml
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/HServerInfo.java
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
    hadoop/hbase/trunk/src/test/hbase-site.xml
    hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/MiniHBaseCluster.java
    hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/MiniZooKeeperCluster.java

Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=769989&r1=769988&r2=769989&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Wed Apr 29 23:14:57 2009
@@ -178,6 +178,8 @@
                split a key range in N chunks (Jon Gray via Stack)
    HBASE-1350  New method in HTable.java to return start and end keys for
                regions in a table (Vimal Mathew via Stack)
+   HBASE-1271  Allow multiple tests to run on one machine
+               (Evgeny Ryabitskiy via Stack)
 
 Release 0.19.0 - 01/21/2009
   INCOMPATIBLE CHANGES

Modified: hadoop/hbase/trunk/conf/hbase-default.xml
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/conf/hbase-default.xml?rev=769989&r1=769988&r2=769989&view=diff
==============================================================================
--- hadoop/hbase/trunk/conf/hbase-default.xml (original)
+++ hadoop/hbase/trunk/conf/hbase-default.xml Wed Apr 29 23:14:57 2009
@@ -108,6 +108,14 @@
     </description>
   </property>
   <property>
+    <name>hbase.regionserver.info.port.auto</name>
+    <value>false</value>
+    <description>Info server auto port bind. Enables automatic port
+    search if hbase.regionserver.info.port is already in use.
+    Useful for testing, turned off by default.
+    </description>
+  </property>
+  <property>
     <name>hbase.regionserver.info.bindAddress</name>
     <value>0.0.0.0</value>
     <description>The address for the hbase regionserver web UI

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/HServerInfo.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/HServerInfo.java?rev=769989&r1=769988&r2=769989&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/HServerInfo.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/HServerInfo.java Wed Apr 29 23:14:57 2009
@@ -111,6 +111,13 @@
   }
   
   /**
+   * @param infoPort - new port of info server
+   */
+  public void setInfoPort(int infoPort) {
+    this.infoPort = infoPort;
+  }
+  
+  /**
    * @param startCode the startCode to set
    */
   public synchronized void setStartCode(long startCode) {

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=769989&r1=769988&r2=769989&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 Wed Apr 29 23:14:57 2009
@@ -26,6 +26,7 @@
 import java.lang.management.RuntimeMXBean;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
+import java.net.BindException;
 import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -1056,11 +1057,30 @@
     this.leases.start();
     // Put up info server.
     int port = this.conf.getInt("hbase.regionserver.info.port", 60030);
+    // -1 is for disabling info server
     if (port >= 0) {
-      String a = this.conf.get("hbase.master.info.bindAddress", "0.0.0.0");
-      this.infoServer = new InfoServer("regionserver", a, port, false);
-      this.infoServer.setAttribute("regionserver", this);
-      this.infoServer.start();
+      String addr = this.conf.get("hbase.master.info.bindAddress", "0.0.0.0");
+      // check if auto port bind enabled
+      boolean auto = this.conf.getBoolean("hbase.regionserver.info.port.auto",
+          false);
+      while (true) {
+        try {
+          this.infoServer = new InfoServer("regionserver", addr, port, false);
+          this.infoServer.setAttribute("regionserver", this);
+          this.infoServer.start();
+          break;
+        } catch (BindException e) {
+          if (!auto){
+            // auto bind disabled throw BindException
+            throw e;
+          }
+          // auto bind enabled, try to use another port
+          LOG.info("Failed binding http info server to port: " + port);
+          port++;
+          // update HRS server info
+          serverInfo.setInfoPort(port);
+        }
+      } 
     }
 
     // Set up the safe mode handler if safe mode has been configured.

Modified: hadoop/hbase/trunk/src/test/hbase-site.xml
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/test/hbase-site.xml?rev=769989&r1=769988&r2=769989&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/test/hbase-site.xml (original)
+++ hadoop/hbase/trunk/src/test/hbase-site.xml Wed Apr 29 23:14:57 2009
@@ -82,6 +82,14 @@
     </description>
   </property>
   <property>
+    <name>hbase.regionserver.info.port.auto</name>
+    <value>true</value>
+    <description>Info server auto port bind. Enables automatic port
+    search if hbase.regionserver.info.port is already in use.
+    Enabled for testing to run multiple tests on one machine.
+    </description>
+  </property>
+  <property>
     <name>hbase.master.lease.thread.wakefrequency</name>
     <value>3000</value>
     <description>The interval between checks for expired region server leases.

Modified: hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/MiniHBaseCluster.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/MiniHBaseCluster.java?rev=769989&r1=769988&r2=769989&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/MiniHBaseCluster.java (original)
+++ hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/MiniHBaseCluster.java Wed Apr 29 23:14:57 2009
@@ -20,6 +20,7 @@
 package org.apache.hadoop.hbase;
 
 import java.io.IOException;
+import java.net.BindException;
 import java.util.List;
 
 import org.apache.commons.logging.Log;
@@ -54,8 +55,20 @@
   private void init(final int nRegionNodes) throws IOException {
     try {
       // start up a LocalHBaseCluster
-      hbaseCluster = new LocalHBaseCluster(conf, nRegionNodes);
-      hbaseCluster.startup();
+      while (true) {
+        try {
+          hbaseCluster = new LocalHBaseCluster(conf, nRegionNodes);
+          hbaseCluster.startup();
+        } catch (BindException e) {
+          //this port is already in use. try to use another (for multiple testing)
+          int port = conf.getInt("hbase.master.port", DEFAULT_MASTER_PORT);
+          LOG.info("MiniHBaseCluster: Failed binding Master to port: " + port);
+          port++;
+          conf.setInt("hbase.master.port", port);
+          continue;
+        }
+        break;
+      }
     } catch(IOException e) {
       shutdown();
       throw e;

Modified: hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/MiniZooKeeperCluster.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/MiniZooKeeperCluster.java?rev=769989&r1=769988&r2=769989&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/MiniZooKeeperCluster.java (original)
+++ hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/MiniZooKeeperCluster.java Wed Apr 29 23:14:57 2009
@@ -25,6 +25,7 @@
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.Reader;
+import java.net.BindException;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.util.HashMap;
@@ -48,7 +49,6 @@
   private static final Log LOG = LogFactory.getLog(MiniZooKeeperCluster.class);
 
   // TODO: make this more configurable?
-  private static final int CLIENT_PORT_START = 21810; // use non-standard port
   private static final int LEADER_PORT_START = 31810; // use non-standard port
   private static final int TICK_TIME = 2000;
   private static final int INIT_LIMIT = 3;
@@ -56,6 +56,7 @@
   private static final int CONNECTION_TIMEOUT = 30000;
 
   private boolean started;
+  private int clientPortStart = 21810; // use non-standard port
   private int numPeers;
   private File baseDir;
   private String quorumServers;
@@ -119,13 +120,23 @@
     recreateDir(dir);
 
     ZooKeeperServer server = new ZooKeeperServer(dir, dir, TICK_TIME);
-    standaloneServerFactory = new NIOServerCnxn.Factory(CLIENT_PORT_START);
+    while (true) {
+      try {
+        standaloneServerFactory = new NIOServerCnxn.Factory(clientPortStart);
+      } catch (BindException e) {
+        LOG.info("Faild binding ZK Server to client port: " + clientPortStart);
+        //this port is already in use. try to use another
+        clientPortStart++;
+        continue;
+      }
+      break;
+    }
     standaloneServerFactory.startup(server);
 
-    quorumServers = "localhost:" + CLIENT_PORT_START;
+    quorumServers = "localhost:" + clientPortStart;
     ZooKeeperWrapper.setQuorumServers(quorumServers);
 
-    if (!waitForServerUp(CLIENT_PORT_START, CONNECTION_TIMEOUT)) {
+    if (!waitForServerUp(clientPortStart, CONNECTION_TIMEOUT)) {
       throw new IOException("Waiting for startup of standalone server");
     }
   }
@@ -149,7 +160,7 @@
       File dir = new File(baseDir, "zookeeper-peer-" + id);
       recreateDir(dir);
 
-      int port = CLIENT_PORT_START + id;
+      int port = clientPortStart + id;
       quorumPeers[id - 1] = new QuorumPeer(peers, dir, dir, port, 0, id,
           TICK_TIME, INIT_LIMIT, SYNC_LIMIT);
 
@@ -169,7 +180,7 @@
 
     // Wait for quorum peers to be up before going on.
     for (int id = 1; id <= numPeers; ++id) {
-      int port = CLIENT_PORT_START + id;
+      int port = clientPortStart + id;
       if (!waitForServerUp(port, CONNECTION_TIMEOUT)) {
         throw new IOException("Waiting for startup of peer " + id);
       }
@@ -220,7 +231,7 @@
     }
 
     for (int id = 1; id <= quorumPeers.length; ++id) {
-      int port = CLIENT_PORT_START + id;
+      int port = clientPortStart + id;
       if (!waitForServerDown(port, CONNECTION_TIMEOUT)) {
         throw new IOException("Waiting for shutdown of peer " + id);
       }
@@ -229,7 +240,7 @@
 
   private void shutdownStandalone() throws IOException {
     standaloneServerFactory.shutdown();
-    if (!waitForServerDown(CLIENT_PORT_START, CONNECTION_TIMEOUT)) {
+    if (!waitForServerDown(clientPortStart, CONNECTION_TIMEOUT)) {
       throw new IOException("Waiting for shutdown of standalone server");
     }
   }