Details
Description
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:
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();
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):
this.getConfiguration().setInt(HConstants.MASTER_INFO_PORT, -1); this.getConfiguration().setInt(HConstants.REGIONSERVER_PORT, -1);
OPTION 2 (always force random port assignment if user has not explicitly defined alternate port):
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); }
Attachments
Attachments
Issue Links
- blocks
-
HBASE-17524 HBase 1.3.1 release
- Closed