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"); } }