Daniel Vimont created HBASE-15835:
-------------------------------------
Summary: HBaseTestingUtility#startMiniCluster throws
"HMasterAddress already in use" RuntimeException when a local instance of HBase
is running
Key: HBASE-15835
URL: https://issues.apache.org/jira/browse/HBASE-15835
Project: HBase
Issue Type: Bug
Components: API
Affects Versions: 2.0.0
Reporter: Daniel Vimont
Fix For: 2.0.0
When a MiniCluster is being started with the
{{HBaseTestUtility#startMiniCluster}} method (most typically in the context of
JUnit testing), if a local HBase instance is already running (or for that
matter, another thread with another MiniCluster is already running), the
startup will fail with a RuntimeException saying "HMasterAddress already in
use", referring explicitly to contention for the same default master info port
(16010).
This problem most recently came up in conjunction with HBASE-14876 and its
sub-JIRAs (development of new HBase-oriented Maven archetypes), but this is
apparently a known issue to veteran developers, who tend to set up the
@BeforeClass sections of their test modules with code similar to the following:
{code}
UTIL = HBaseTestingUtility.createLocalHTU();
// disable UI's on test cluster.
UTIL.getConfiguration().setInt("hbase.master.info.port", -1);
UTIL.getConfiguration().setInt("hbase.regionserver.info.port", -1);
UTIL.startMiniCluster();
{code}
A comprehensive solution modeled on this should be put directly into
HBaseTestUtility's main constructor, using one of the following options:
OPTION 1 (always force random port assignment):
{code}
this.getConfiguration().setInt(HConstants.MASTER_INFO_PORT, -1);
this.getConfiguration().setInt(HConstants.REGIONSERVER_PORT, -1);
{code}
OPTION 2 (always force random port assignment if user has not explicitly
defined alternate port):
{code}
Configuration conf = this.getConfiguration();
if (conf.getInt(HConstants.MASTER_INFO_PORT,
HConstants.DEFAULT_MASTER_INFOPORT)
== HConstants.DEFAULT_MASTER_INFOPORT) {
conf.setInt(HConstants.MASTER_INFO_PORT, -1);
}
if (conf.getInt(HConstants.REGIONSERVER_PORT,
HConstants.DEFAULT_REGIONSERVER_PORT)
== HConstants.DEFAULT_REGIONSERVER_PORT) {
conf.setInt(HConstants.REGIONSERVER_PORT, -1);
}
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)