YARN-7434. Router getApps REST invocation fails with multiple RMs. Contributed by Inigo Goiri.

(cherry picked from commit 6e2259264ad9525eeec2a14055d53236711659d7)
This commit is contained in:
Inigo Goiri 2017-11-02 21:29:34 -07:00
parent 931987f470
commit 2d8d420f26

View File

@ -684,10 +684,10 @@ public AppsInfo getApps(final HttpServletRequest hsr, final String stateQuery,
CompletionService<AppsInfo> compSvc = CompletionService<AppsInfo> compSvc =
new ExecutorCompletionService<>(this.threadpool); 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()) { 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<AppsInfo>() { compSvc.submit(new Callable<AppsInfo>() {
@Override @Override
public AppsInfo call() { public AppsInfo call() {
@ -746,25 +746,33 @@ private HttpServletRequestWrapper clone(final HttpServletRequest hsr) {
if (hsr == null) { if (hsr == null) {
return null; return null;
} }
@SuppressWarnings("unchecked")
final Map<String, String[]> parameterMap =
(Map<String, String[]>) 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) { return new HttpServletRequestWrapper(hsr) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public Map<String, String[]> getParameterMap() { public Map<String, String[]> getParameterMap() {
return (Map<String, String[]>) hsr.getParameterMap(); return parameterMap;
} }
public String getPathInfo() { public String getPathInfo() {
return hsr.getPathInfo(); return pathInfo;
} }
public String getRemoteUser() { public String getRemoteUser() {
return hsr.getRemoteUser(); return user;
} }
public Principal getUserPrincipal() { public Principal getUserPrincipal() {
return hsr.getUserPrincipal(); return principal;
} }
public String getHeader(String value) { public String getHeader(String value) {
// we override only Accept // we override only Accept
if (value.equals(HttpHeaders.ACCEPT)) { if (value.equals(HttpHeaders.ACCEPT)) {
return RouterWebServiceUtil.getMediaTypeFromHttpServletRequest( return mediaType;
hsr, AppsInfo.class);
} }
return null; return null;
} }