diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java index 7e1264059f..8adb1149df 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java @@ -134,6 +134,14 @@ public final class HttpServer2 implements FilterContainer { "hadoop.http.socket.backlog.size"; public static final int HTTP_SOCKET_BACKLOG_SIZE_DEFAULT = 128; public static final String HTTP_MAX_THREADS_KEY = "hadoop.http.max.threads"; + public static final String HTTP_ACCEPTOR_COUNT_KEY = + "hadoop.http.acceptor.count"; + // -1 to use default behavior of setting count based on CPU core count + public static final int HTTP_ACCEPTOR_COUNT_DEFAULT = -1; + public static final String HTTP_SELECTOR_COUNT_KEY = + "hadoop.http.selector.count"; + // -1 to use default behavior of setting count based on CPU core count + public static final int HTTP_SELECTOR_COUNT_DEFAULT = -1; public static final String HTTP_TEMP_DIR_KEY = "hadoop.http.temp.dir"; public static final String FILTER_INITIALIZER_PROPERTY @@ -465,7 +473,9 @@ public HttpServer2 build() throws IOException { private ServerConnector createHttpChannelConnector( Server server, HttpConfiguration httpConfig) { - ServerConnector conn = new ServerConnector(server); + ServerConnector conn = new ServerConnector(server, + conf.getInt(HTTP_ACCEPTOR_COUNT_KEY, HTTP_ACCEPTOR_COUNT_DEFAULT), + conf.getInt(HTTP_SELECTOR_COUNT_KEY, HTTP_SELECTOR_COUNT_DEFAULT)); ConnectionFactory connFactory = new HttpConnectionFactory(httpConfig); conn.addConnectionFactory(connFactory); configureChannelConnector(conn); diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpServer.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpServer.java index ca7e466b79..7350d09fb2 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpServer.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpServer.java @@ -147,7 +147,7 @@ public void doGet(HttpServletRequest request, @BeforeClass public static void setup() throws Exception { Configuration conf = new Configuration(); - conf.setInt(HttpServer2.HTTP_MAX_THREADS_KEY, 10); + conf.setInt(HttpServer2.HTTP_MAX_THREADS_KEY, MAX_THREADS); server = createTestServer(conf); server.addServlet("echo", "/echo", EchoServlet.class); server.addServlet("echomap", "/echomap", EchoMapServlet.class); @@ -195,6 +195,27 @@ public void run() { ready.await(); start.countDown(); } + + /** + * Test that the number of acceptors and selectors can be configured by + * trying to configure more of them than would be allowed based on the + * maximum thread count. + */ + @Test + public void testAcceptorSelectorConfigurability() throws Exception { + Configuration conf = new Configuration(); + conf.setInt(HttpServer2.HTTP_MAX_THREADS_KEY, MAX_THREADS); + conf.setInt(HttpServer2.HTTP_ACCEPTOR_COUNT_KEY, MAX_THREADS - 2); + conf.setInt(HttpServer2.HTTP_SELECTOR_COUNT_KEY, MAX_THREADS - 2); + HttpServer2 badserver = createTestServer(conf); + try { + badserver.start(); + // Should not succeed + fail(); + } catch (IOException ioe) { + assertTrue(ioe.getCause() instanceof IllegalStateException); + } + } @Test public void testEcho() throws Exception { assertEquals("a:b\nc:d\n",