From b69ba0f3307a90500aeb0c5db9e582fcda60b501 Mon Sep 17 00:00:00 2001 From: Eric Yang Date: Tue, 26 Jun 2018 17:34:57 -0400 Subject: [PATCH] YARN-8108. Added option to disable loading existing filters to prevent security filter from initialize twice. Contributed by Sunil Govindan --- .../org/apache/hadoop/yarn/webapp/WebApps.java | 14 +++++++++++--- .../server/resourcemanager/ResourceManager.java | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/WebApps.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/WebApps.java index 0d045f36a9..0e9f0a77be 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/WebApps.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/WebApps.java @@ -83,6 +83,7 @@ static class ServletStruct { public String name; public String spec; public Map params; + public boolean loadExistingFilters = true; } final String name; @@ -151,12 +152,13 @@ public Builder withServlet(String name, String pathSpec, public Builder withServlet(String name, String pathSpec, Class servlet, - Map params) { + Map params,boolean loadExistingFilters) { ServletStruct struct = new ServletStruct(); struct.clazz = servlet; struct.name = name; struct.spec = pathSpec; struct.params = params; + struct.loadExistingFilters = loadExistingFilters; servlets.add(struct); return this; } @@ -256,9 +258,15 @@ public void setup() { pathList.add("/" + wsName + "/*"); } } + for (ServletStruct s : servlets) { if (!pathList.contains(s.spec)) { - pathList.add(s.spec); + // The servlet told us to not load-existing filters, but we still want + // to add the default authentication filter always, so add it to the + // pathList + if (!s.loadExistingFilters) { + pathList.add(s.spec); + } } } if (conf == null) { @@ -333,7 +341,7 @@ public void setup() { HttpServer2 server = builder.build(); for(ServletStruct struct: servlets) { - if (struct.params != null) { + if (!struct.loadExistingFilters) { server.addInternalServlet(struct.name, struct.spec, struct.clazz, struct.params); } else { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java index c53311127c..0b7e87cc0b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java @@ -1111,7 +1111,7 @@ protected void startWepApp() { "ws") .with(conf) .withServlet("API-Service", "/app/*", - ServletContainer.class, params) + ServletContainer.class, params, false) .withHttpSpnegoPrincipalKey( YarnConfiguration.RM_WEBAPP_SPNEGO_USER_NAME_KEY) .withHttpSpnegoKeytabKey(