diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.java index 6579191..e60ad31 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/amfilter/AmIpFilter.java @@ -23,10 +23,12 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.UnknownHostException; +import java.net.HttpURLConnection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.Collection; import javax.servlet.Filter; import javax.servlet.FilterChain; @@ -43,7 +45,6 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.server.webproxy.ProxyUtils; import org.apache.hadoop.yarn.server.webproxy.WebAppProxyServlet; -import org.apache.hadoop.yarn.util.RMHAUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -187,24 +188,51 @@ public void doFilter(ServletRequest req, ServletResponse resp, } } - protected String findRedirectUrl() throws ServletException { - String addr; - if (proxyUriBases.size() == 1) { // external proxy or not RM HA + private String findRedirectUrl() throws ServletException { + String addr = null; + if (proxyUriBases.size() == 1) { + // external proxy or not RM HA addr = proxyUriBases.values().iterator().next(); - } else { // RM HA + } else { + // RM HA YarnConfiguration conf = new YarnConfiguration(); - String activeRMId = RMHAUtils.findActiveRMHAId(conf); - String addressPropertyPrefix = YarnConfiguration.useHttps(conf) - ? YarnConfiguration.RM_WEBAPP_HTTPS_ADDRESS - : YarnConfiguration.RM_WEBAPP_ADDRESS; - String host = conf.get( - HAUtil.addSuffix(addressPropertyPrefix, activeRMId)); - addr = proxyUriBases.get(host); + Collection rmIds = + conf.getStringCollection(YarnConfiguration.RM_HA_IDS); + + for (String rmId: rmIds) { + String addressPropertyPrefix = YarnConfiguration.useHttps(conf) ? + YarnConfiguration.RM_WEBAPP_HTTPS_ADDRESS : + YarnConfiguration.RM_WEBAPP_ADDRESS; + String host = conf.get(HAUtil.addSuffix(addressPropertyPrefix, rmId)); + String url = proxyUriBases.get(host); + if (isValidUrl(url)) { + addr = url; + } else { + continue; + } + } } + if (addr == null) { throw new ServletException( "Could not determine the proxy server for redirection"); } return addr; } + + private boolean isValidUrl(String url) { + try { + HttpURLConnection conn = + (HttpURLConnection) new URL(url).openConnection(); + conn.connect(); + if (conn.getResponseCode() == 404) { + return false; + } else { + return true; + } + } catch (Exception e) { + LOG.debug("Failed to connect to " + url + ": " + e.toString()); + return false; + } + } }