From 6fc09beac497b40928b6b0524d83ecf6e7abf932 Mon Sep 17 00:00:00 2001 From: Inigo Goiri Date: Thu, 2 Nov 2017 21:29:34 -0700 Subject: [PATCH] YARN-7434. Router getApps REST invocation fails with multiple RMs. Contributed by Inigo Goiri. --- .../webapp/FederationInterceptorREST.java | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java index 6e67634849..626d794c1e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java @@ -682,10 +682,10 @@ public AppsInfo getApps(HttpServletRequest hsr, String stateQuery, CompletionService compSvc = new ExecutorCompletionService<>(this.threadpool); + // HttpServletRequest does not work with ExecutorCompletionService. + // Create a duplicate hsr. + final HttpServletRequest hsrCopy = clone(hsr); for (final SubClusterInfo info : subClustersActive.values()) { - // HttpServletRequest does not work with ExecutorCompletionService. - // Create a duplicate hsr. - final HttpServletRequest hsrCopy = clone(hsr); compSvc.submit(new Callable() { @Override public AppsInfo call() { @@ -744,24 +744,32 @@ private HttpServletRequestWrapper clone(final HttpServletRequest hsr) { if (hsr == null) { return null; } + @SuppressWarnings("unchecked") + final Map parameterMap = + (Map) hsr.getParameterMap(); + final String pathInfo = hsr.getPathInfo(); + final String user = hsr.getRemoteUser(); + final Principal principal = hsr.getUserPrincipal(); + final String mediaType = + RouterWebServiceUtil.getMediaTypeFromHttpServletRequest( + hsr, AppsInfo.class); return new HttpServletRequestWrapper(hsr) { public Map getParameterMap() { - return hsr.getParameterMap(); + return parameterMap; } public String getPathInfo() { - return hsr.getPathInfo(); + return pathInfo; } public String getRemoteUser() { - return hsr.getRemoteUser(); + return user; } public Principal getUserPrincipal() { - return hsr.getUserPrincipal(); + return principal; } public String getHeader(String value) { // we override only Accept if (value.equals(HttpHeaders.ACCEPT)) { - return RouterWebServiceUtil.getMediaTypeFromHttpServletRequest( - hsr, AppsInfo.class); + return mediaType; } return null; }