From a83753b73562123e35b76fe91a173033a01e2bc2 Mon Sep 17 00:00:00 2001 From: Tsz-wo Sze Date: Mon, 7 Nov 2011 20:51:15 +0000 Subject: [PATCH] HADOOP-7688. Add servlet handler check in HttpServer.start(). Contributed by Uma Maheswara Rao G git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1198924 13f79535-47bb-0310-9956-ffa450edef68 --- .../hadoop-common/CHANGES.txt | 5 ++- .../org/apache/hadoop/http/HttpServer.java | 8 +++++ .../apache/hadoop/http/TestServletFilter.java | 34 ++++++++++++++++++- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index f559cbb9cc9..7eafd25a908 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -55,7 +55,10 @@ Trunk (unreleased changes) HADOOP-7792. Add verifyToken method to AbstractDelegationTokenSecretManager. (jitendra) - HADOOP-7776 Make the Ipc-Header in a RPC-Payload an explicit header (sanjay) + HADOOP-7776 Make the Ipc-Header in a RPC-Payload an explicit header (sanjay) + + HADOOP-7688. Add servlet handler check in HttpServer.start(). + (Uma Maheswara Rao G via szetszwo) BUGS diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java index ccc72edacfd..e529e789edd 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java @@ -707,6 +707,14 @@ public class HttpServer implements FilterContainer { listener.setPort((oriPort += 1)); } } + // Make sure there is no handler failures. + Handler[] handlers = webServer.getHandlers(); + for (int i = 0; i < handlers.length; i++) { + if (handlers[i].isFailed()) { + throw new IOException( + "Problem in starting http server. Server handlers failed"); + } + } } catch (IOException e) { throw e; } catch (InterruptedException e) { diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestServletFilter.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestServletFilter.java index 6cd21beb1b7..7bf608767e0 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestServletFilter.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestServletFilter.java @@ -45,7 +45,7 @@ public class TestServletFilter extends HttpServerFunctionalTest { static public class SimpleFilter implements Filter { private FilterConfig filterConfig = null; - public void init(FilterConfig filterConfig) { + public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; } @@ -137,4 +137,36 @@ public class TestServletFilter extends HttpServerFunctionalTest { http.stop(); } } + + static public class ErrorFilter extends SimpleFilter { + @Override + public void init(FilterConfig arg0) throws ServletException { + throw new ServletException("Throwing the exception from Filter init"); + } + + /** Configuration for the filter */ + static public class Initializer extends FilterInitializer { + public Initializer() { + } + + public void initFilter(FilterContainer container, Configuration conf) { + container.addFilter("simple", ErrorFilter.class.getName(), null); + } + } + } + + @Test + public void testServletFilterWhenInitThrowsException() throws Exception { + Configuration conf = new Configuration(); + // start a http server with CountingFilter + conf.set(HttpServer.FILTER_INITIALIZER_PROPERTY, + ErrorFilter.Initializer.class.getName()); + HttpServer http = createTestServer(conf); + try { + http.start(); + fail("expecting exception"); + } catch (IOException e) { + assertTrue( e.getMessage().contains("Problem in starting http server. Server handlers failed")); + } + } }