diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index 1e23591d51da..52ac42a8f31f 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -2268,6 +2268,7 @@ private void putUpWebUI() throws IOException { // auto bind enabled, try to use another port LOG.info("Failed binding http info server to port: " + port); port++; + LOG.info("Retry starting http info server with port: " + port); } } port = this.infoServer.getPort(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClusterPortAssignment.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClusterPortAssignment.java index 933cdc661d10..4d37ca5dcfc6 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClusterPortAssignment.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClusterPortAssignment.java @@ -19,7 +19,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.net.BindException; +import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.hadoop.hbase.testclassification.MediumTests; import org.junit.ClassRule; import org.junit.Test; @@ -27,7 +29,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@org.junit.Ignore // See HBASE-24342. This test can't pass 100% of time as written so disabling @Category(MediumTests.class) public class TestClusterPortAssignment { @ClassRule @@ -41,7 +42,7 @@ public class TestClusterPortAssignment { * Check that we can start an HBase cluster specifying a custom set of * RPC and infoserver ports. */ - @Test + @Test(timeout = 300000) public void testClusterPortAssignment() throws Exception { boolean retry = false; do { @@ -50,10 +51,13 @@ public void testClusterPortAssignment() throws Exception { int rsPort = HBaseTestingUtility.randomFreePort(); int rsInfoPort = HBaseTestingUtility.randomFreePort(); TEST_UTIL.getConfiguration().setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, false); + TEST_UTIL.getConfiguration().setBoolean(HConstants.REGIONSERVER_INFO_PORT_AUTO, false); + TEST_UTIL.getConfiguration().setBoolean("fs.hdfs.impl.disable.cache", true); TEST_UTIL.getConfiguration().setInt(HConstants.MASTER_PORT, masterPort); TEST_UTIL.getConfiguration().setInt(HConstants.MASTER_INFO_PORT, masterInfoPort); TEST_UTIL.getConfiguration().setInt(HConstants.REGIONSERVER_PORT, rsPort); TEST_UTIL.getConfiguration().setInt(HConstants.REGIONSERVER_INFO_PORT, rsInfoPort); + LOG.info("Ports: {}, {}, {}, {}", masterPort, masterInfoPort, rsPort, rsInfoPort); try { MiniHBaseCluster cluster = TEST_UTIL.startMiniCluster(); assertTrue("Cluster failed to come up", cluster.waitForActiveAndReadyMaster(30000)); @@ -67,13 +71,14 @@ public void testClusterPortAssignment() throws Exception { assertEquals("RS info port is incorrect", rsInfoPort, cluster.getRegionServer(0).getInfoServer().getPort()); } catch (Exception e) { - if (e instanceof BindException || e.getCause() != null && - (e.getCause() instanceof BindException || e.getCause().getCause() != null && - e.getCause().getCause() instanceof BindException)) { + Throwable rootCause = ExceptionUtils.getRootCause(e); + if (rootCause instanceof BindException) { LOG.info("Failed bind, need to retry", e); retry = true; } else { - throw e; + LOG.error("Failed to start mini cluster", e); + retry = false; + fail("Failed to start mini cluster with assigned ports."); } } finally { TEST_UTIL.shutdownMiniCluster();