Sfoglia il codice sorgente

HADOOP-7688. When a servlet filter throws an exception in init(..), the Jetty server failed silently. Contributed by Uma Maheswara Rao G.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.23@1587640 13f79535-47bb-0310-9956-ffa450edef68
Kihwal Lee 11 anni fa
parent
commit
76528638c7

+ 3 - 0
hadoop-common-project/hadoop-common/CHANGES.txt

@@ -15,6 +15,9 @@ Release 0.23.11 - UNRELEASED
     HADOOP-10454. Provide FileContext version of har file system. (kihwal
     via jeagles)
 
+    HADOOP-7688. When a servlet filter throws an exception in init(..), 
+    the Jetty server failed silently. (Uma Maheswara Rao G via kihwal)
+
   OPTIMIZATIONS
     
   BUG FIXES

+ 8 - 0
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java

@@ -658,6 +658,14 @@ public class HttpServer implements FilterContainer {
         LOG.info("HttpServer.start() threw a MultiException", ex);
         throw ex;
       }
+      // 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 (Exception e) {

+ 34 - 1
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,37 @@ 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"));
+    }
+  }
 }