Forráskód Böngészése

YARN-1859. Fixed WebAppProxyServlet to correctly handle applications absent on the ResourceManager. Contributed by Zhijie Shen.
svn merge --ignore-ancestry -c 1579866 ../../trunk/


git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2.4@1579868 13f79535-47bb-0310-9956-ffa450edef68

Vinod Kumar Vavilapalli 11 éve
szülő
commit
220c62e4f8

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

@@ -477,6 +477,9 @@ Release 2.4.0 - UNRELEASED
     and thus avoid the failure of TestRMFailover#testRMWebAppRedirect. (Zhijie
     and thus avoid the failure of TestRMFailover#testRMWebAppRedirect. (Zhijie
     Shen via vinodkv)
     Shen via vinodkv)
 
 
+    YARN-1859. Fixed WebAppProxyServlet to correctly handle applications absent
+    on the ResourceManager. (Zhijie Shen via vinodkv)
+
 Release 2.3.1 - UNRELEASED
 Release 2.3.1 - UNRELEASED
 
 
   INCOMPATIBLE CHANGES
   INCOMPATIBLE CHANGES

+ 7 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/WebAppProxyServlet.java

@@ -50,6 +50,7 @@ import org.apache.hadoop.io.IOUtils;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
+import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException;
 import org.apache.hadoop.yarn.exceptions.YarnException;
 import org.apache.hadoop.yarn.exceptions.YarnException;
 import org.apache.hadoop.yarn.util.Apps;
 import org.apache.hadoop.yarn.util.Apps;
 import org.apache.hadoop.yarn.util.StringHelper;
 import org.apache.hadoop.yarn.util.StringHelper;
@@ -274,7 +275,12 @@ public class WebAppProxyServlet extends HttpServlet {
       
       
       boolean checkUser = securityEnabled && (!userWasWarned || !userApproved);
       boolean checkUser = securityEnabled && (!userWasWarned || !userApproved);
 
 
-      ApplicationReport applicationReport = getApplicationReport(id);
+      ApplicationReport applicationReport = null;
+      try {
+        applicationReport = getApplicationReport(id);
+      } catch (ApplicationNotFoundException e) {
+        applicationReport = null;
+      }
       if(applicationReport == null) {
       if(applicationReport == null) {
         LOG.warn(req.getRemoteUser()+" Attempting to access "+id+
         LOG.warn(req.getRemoteUser()+" Attempting to access "+id+
             " that was not found");
             " that was not found");

+ 13 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/TestWebAppProxyServlet.java

@@ -52,6 +52,7 @@ import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.YarnApplicationState;
 import org.apache.hadoop.yarn.api.records.YarnApplicationState;
 import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationReportPBImpl;
 import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationReportPBImpl;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
+import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException;
 import org.apache.hadoop.yarn.exceptions.YarnException;
 import org.apache.hadoop.yarn.exceptions.YarnException;
 import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
 import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
 import org.apache.hadoop.yarn.webapp.util.WebAppUtils;
 import org.apache.hadoop.yarn.webapp.util.WebAppUtils;
@@ -149,11 +150,20 @@ public class TestWebAppProxyServlet {
       assertEquals(HttpURLConnection.HTTP_OK, proxyConn.getResponseCode());
       assertEquals(HttpURLConnection.HTTP_OK, proxyConn.getResponseCode());
       assertTrue(isResponseCookiePresent(
       assertTrue(isResponseCookiePresent(
           proxyConn, "checked_application_0_0000", "true"));
           proxyConn, "checked_application_0_0000", "true"));
-      // cannot found application
+      // cannot found application 1: null
       appReportFetcher.answer = 1;
       appReportFetcher.answer = 1;
       proxyConn = (HttpURLConnection) url.openConnection();
       proxyConn = (HttpURLConnection) url.openConnection();
       proxyConn.setRequestProperty("Cookie", "checked_application_0_0000=true");
       proxyConn.setRequestProperty("Cookie", "checked_application_0_0000=true");
       proxyConn.connect();
       proxyConn.connect();
+      assertEquals(HttpURLConnection.HTTP_NOT_FOUND,
+          proxyConn.getResponseCode());
+      assertFalse(isResponseCookiePresent(
+          proxyConn, "checked_application_0_0000", "true"));
+      // cannot found application 2: ApplicationNotFoundException
+      appReportFetcher.answer = 4;
+      proxyConn = (HttpURLConnection) url.openConnection();
+      proxyConn.setRequestProperty("Cookie", "checked_application_0_0000=true");
+      proxyConn.connect();
       assertEquals(HttpURLConnection.HTTP_NOT_FOUND,
       assertEquals(HttpURLConnection.HTTP_NOT_FOUND,
           proxyConn.getResponseCode());
           proxyConn.getResponseCode());
       assertFalse(isResponseCookiePresent(
       assertFalse(isResponseCookiePresent(
@@ -340,6 +350,8 @@ public class TestWebAppProxyServlet {
         ApplicationReport result =  getDefaultApplicationReport(appId);
         ApplicationReport result =  getDefaultApplicationReport(appId);
         result.setYarnApplicationState(YarnApplicationState.KILLED);
         result.setYarnApplicationState(YarnApplicationState.KILLED);
         return result;
         return result;
+      } else if (answer == 4) {
+        throw new ApplicationNotFoundException("Application is not found");
       }
       }
       return null;
       return null;
     }
     }