HBASE-1271 Allow multiple tests to run on one machine
git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@769989 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
3db051fba3
commit
b6ccf3081a
|
@ -178,6 +178,8 @@ Release 0.20.0 - Unreleased
|
||||||
split a key range in N chunks (Jon Gray via Stack)
|
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
|
HBASE-1350 New method in HTable.java to return start and end keys for
|
||||||
regions in a table (Vimal Mathew via Stack)
|
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
|
Release 0.19.0 - 01/21/2009
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -107,6 +107,14 @@
|
||||||
Set to -1 if you do not want the info server to run.
|
Set to -1 if you do not want the info server to run.
|
||||||
</description>
|
</description>
|
||||||
</property>
|
</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>
|
<property>
|
||||||
<name>hbase.regionserver.info.bindAddress</name>
|
<name>hbase.regionserver.info.bindAddress</name>
|
||||||
<value>0.0.0.0</value>
|
<value>0.0.0.0</value>
|
||||||
|
|
|
@ -110,6 +110,13 @@ public class HServerInfo implements WritableComparable<HServerInfo> {
|
||||||
return this.infoPort;
|
return this.infoPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param infoPort - new port of info server
|
||||||
|
*/
|
||||||
|
public void setInfoPort(int infoPort) {
|
||||||
|
this.infoPort = infoPort;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param startCode the startCode to set
|
* @param startCode the startCode to set
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -26,6 +26,7 @@ import java.lang.management.MemoryUsage;
|
||||||
import java.lang.management.RuntimeMXBean;
|
import java.lang.management.RuntimeMXBean;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.net.BindException;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -1056,11 +1057,30 @@ public class HRegionServer implements HConstants, HRegionInterface,
|
||||||
this.leases.start();
|
this.leases.start();
|
||||||
// Put up info server.
|
// Put up info server.
|
||||||
int port = this.conf.getInt("hbase.regionserver.info.port", 60030);
|
int port = this.conf.getInt("hbase.regionserver.info.port", 60030);
|
||||||
|
// -1 is for disabling info server
|
||||||
if (port >= 0) {
|
if (port >= 0) {
|
||||||
String a = this.conf.get("hbase.master.info.bindAddress", "0.0.0.0");
|
String addr = this.conf.get("hbase.master.info.bindAddress", "0.0.0.0");
|
||||||
this.infoServer = new InfoServer("regionserver", a, port, false);
|
// check if auto port bind enabled
|
||||||
this.infoServer.setAttribute("regionserver", this);
|
boolean auto = this.conf.getBoolean("hbase.regionserver.info.port.auto",
|
||||||
this.infoServer.start();
|
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.
|
// Set up the safe mode handler if safe mode has been configured.
|
||||||
|
|
|
@ -81,6 +81,14 @@
|
||||||
Set to -1 if you do not want the info server to run.
|
Set to -1 if you do not want the info server to run.
|
||||||
</description>
|
</description>
|
||||||
</property>
|
</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>
|
<property>
|
||||||
<name>hbase.master.lease.thread.wakefrequency</name>
|
<name>hbase.master.lease.thread.wakefrequency</name>
|
||||||
<value>3000</value>
|
<value>3000</value>
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
package org.apache.hadoop.hbase;
|
package org.apache.hadoop.hbase;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.BindException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
@ -54,8 +55,20 @@ public class MiniHBaseCluster implements HConstants {
|
||||||
private void init(final int nRegionNodes) throws IOException {
|
private void init(final int nRegionNodes) throws IOException {
|
||||||
try {
|
try {
|
||||||
// start up a LocalHBaseCluster
|
// start up a LocalHBaseCluster
|
||||||
hbaseCluster = new LocalHBaseCluster(conf, nRegionNodes);
|
while (true) {
|
||||||
hbaseCluster.startup();
|
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) {
|
} catch(IOException e) {
|
||||||
shutdown();
|
shutdown();
|
||||||
throw e;
|
throw e;
|
||||||
|
|
|
@ -25,6 +25,7 @@ import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.io.Reader;
|
import java.io.Reader;
|
||||||
|
import java.net.BindException;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -48,7 +49,6 @@ public class MiniZooKeeperCluster {
|
||||||
private static final Log LOG = LogFactory.getLog(MiniZooKeeperCluster.class);
|
private static final Log LOG = LogFactory.getLog(MiniZooKeeperCluster.class);
|
||||||
|
|
||||||
// TODO: make this more configurable?
|
// 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 LEADER_PORT_START = 31810; // use non-standard port
|
||||||
private static final int TICK_TIME = 2000;
|
private static final int TICK_TIME = 2000;
|
||||||
private static final int INIT_LIMIT = 3;
|
private static final int INIT_LIMIT = 3;
|
||||||
|
@ -56,6 +56,7 @@ public class MiniZooKeeperCluster {
|
||||||
private static final int CONNECTION_TIMEOUT = 30000;
|
private static final int CONNECTION_TIMEOUT = 30000;
|
||||||
|
|
||||||
private boolean started;
|
private boolean started;
|
||||||
|
private int clientPortStart = 21810; // use non-standard port
|
||||||
private int numPeers;
|
private int numPeers;
|
||||||
private File baseDir;
|
private File baseDir;
|
||||||
private String quorumServers;
|
private String quorumServers;
|
||||||
|
@ -119,13 +120,23 @@ public class MiniZooKeeperCluster {
|
||||||
recreateDir(dir);
|
recreateDir(dir);
|
||||||
|
|
||||||
ZooKeeperServer server = new ZooKeeperServer(dir, dir, TICK_TIME);
|
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);
|
standaloneServerFactory.startup(server);
|
||||||
|
|
||||||
quorumServers = "localhost:" + CLIENT_PORT_START;
|
quorumServers = "localhost:" + clientPortStart;
|
||||||
ZooKeeperWrapper.setQuorumServers(quorumServers);
|
ZooKeeperWrapper.setQuorumServers(quorumServers);
|
||||||
|
|
||||||
if (!waitForServerUp(CLIENT_PORT_START, CONNECTION_TIMEOUT)) {
|
if (!waitForServerUp(clientPortStart, CONNECTION_TIMEOUT)) {
|
||||||
throw new IOException("Waiting for startup of standalone server");
|
throw new IOException("Waiting for startup of standalone server");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,7 +160,7 @@ public class MiniZooKeeperCluster {
|
||||||
File dir = new File(baseDir, "zookeeper-peer-" + id);
|
File dir = new File(baseDir, "zookeeper-peer-" + id);
|
||||||
recreateDir(dir);
|
recreateDir(dir);
|
||||||
|
|
||||||
int port = CLIENT_PORT_START + id;
|
int port = clientPortStart + id;
|
||||||
quorumPeers[id - 1] = new QuorumPeer(peers, dir, dir, port, 0, id,
|
quorumPeers[id - 1] = new QuorumPeer(peers, dir, dir, port, 0, id,
|
||||||
TICK_TIME, INIT_LIMIT, SYNC_LIMIT);
|
TICK_TIME, INIT_LIMIT, SYNC_LIMIT);
|
||||||
|
|
||||||
|
@ -169,7 +180,7 @@ public class MiniZooKeeperCluster {
|
||||||
|
|
||||||
// Wait for quorum peers to be up before going on.
|
// Wait for quorum peers to be up before going on.
|
||||||
for (int id = 1; id <= numPeers; ++id) {
|
for (int id = 1; id <= numPeers; ++id) {
|
||||||
int port = CLIENT_PORT_START + id;
|
int port = clientPortStart + id;
|
||||||
if (!waitForServerUp(port, CONNECTION_TIMEOUT)) {
|
if (!waitForServerUp(port, CONNECTION_TIMEOUT)) {
|
||||||
throw new IOException("Waiting for startup of peer " + id);
|
throw new IOException("Waiting for startup of peer " + id);
|
||||||
}
|
}
|
||||||
|
@ -220,7 +231,7 @@ public class MiniZooKeeperCluster {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int id = 1; id <= quorumPeers.length; ++id) {
|
for (int id = 1; id <= quorumPeers.length; ++id) {
|
||||||
int port = CLIENT_PORT_START + id;
|
int port = clientPortStart + id;
|
||||||
if (!waitForServerDown(port, CONNECTION_TIMEOUT)) {
|
if (!waitForServerDown(port, CONNECTION_TIMEOUT)) {
|
||||||
throw new IOException("Waiting for shutdown of peer " + id);
|
throw new IOException("Waiting for shutdown of peer " + id);
|
||||||
}
|
}
|
||||||
|
@ -229,7 +240,7 @@ public class MiniZooKeeperCluster {
|
||||||
|
|
||||||
private void shutdownStandalone() throws IOException {
|
private void shutdownStandalone() throws IOException {
|
||||||
standaloneServerFactory.shutdown();
|
standaloneServerFactory.shutdown();
|
||||||
if (!waitForServerDown(CLIENT_PORT_START, CONNECTION_TIMEOUT)) {
|
if (!waitForServerDown(clientPortStart, CONNECTION_TIMEOUT)) {
|
||||||
throw new IOException("Waiting for shutdown of standalone server");
|
throw new IOException("Waiting for shutdown of standalone server");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue