Repository: hadoop Updated Branches: refs/heads/branch-2 c94579f84 -> 5c3070dc1
MAPREDUCE-6405. NullPointerException in App Attempts page. Contributed by Siqi Li and Gera Shegalov. (cherry picked from commit 311a4179cc53a2754d1185b1cb10e6adb1b95d3d) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/5c3070dc Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/5c3070dc Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/5c3070dc Branch: refs/heads/branch-2 Commit: 5c3070dc169d4cfe37c1cb73d5c2573c84b3646c Parents: c94579f Author: Devaraj K <deva...@apache.org> Authored: Sat Jun 20 10:35:04 2015 +0530 Committer: Devaraj K <deva...@apache.org> Committed: Sat Jun 20 10:37:42 2015 +0530 ---------------------------------------------------------------------- hadoop-mapreduce-project/CHANGES.txt | 3 + .../mapreduce/v2/app/webapp/TaskPage.java | 82 +++++++++++--------- 2 files changed, 49 insertions(+), 36 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/5c3070dc/hadoop-mapreduce-project/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-mapreduce-project/CHANGES.txt b/hadoop-mapreduce-project/CHANGES.txt index cc4bb9c..4e24e54 100644 --- a/hadoop-mapreduce-project/CHANGES.txt +++ b/hadoop-mapreduce-project/CHANGES.txt @@ -222,6 +222,9 @@ Release 2.8.0 - UNRELEASED MAPREDUCE-6373. The logger reports total input paths but it is referring to input files. (Bibin A Chundatt via devaraj) + MAPREDUCE-6405. NullPointerException in App Attempts page. + (Siqi Li and Gera Shegalov via devaraj) + Release 2.7.1 - UNRELEASED INCOMPATIBLE CHANGES http://git-wip-us.apache.org/repos/asf/hadoop/blob/5c3070dc/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TaskPage.java ---------------------------------------------------------------------- diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TaskPage.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TaskPage.java index 758b02c..d9f17c8 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TaskPage.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TaskPage.java @@ -24,11 +24,14 @@ import static org.apache.hadoop.yarn.webapp.view.JQueryUI.DATATABLES_ID; import static org.apache.hadoop.yarn.webapp.view.JQueryUI.initID; import static org.apache.hadoop.yarn.webapp.view.JQueryUI.tableInit; +import java.util.EnumSet; import java.util.Collection; import org.apache.commons.lang.StringEscapeUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapreduce.MRConfig; +import org.apache.hadoop.mapreduce.v2.api.records.JobId; +import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptState; import org.apache.hadoop.mapreduce.v2.app.job.TaskAttempt; import org.apache.hadoop.mapreduce.v2.app.webapp.dao.TaskAttemptInfo; import org.apache.hadoop.mapreduce.v2.util.MRWebAppUtil; @@ -48,7 +51,6 @@ public class TaskPage extends AppView { static class AttemptsBlock extends HtmlBlock { final App app; final boolean enableUIActions; - private String stateURLFormat; @Inject AttemptsBlock(App ctx, Configuration conf) { @@ -66,37 +68,36 @@ public class TaskPage extends AppView { return; } + JobId jobId = app.getJob().getID(); if (enableUIActions) { // Kill task attempt - String appID = app.getJob().getID().getAppId().toString(); - String jobID = app.getJob().getID().toString(); - String taskID = app.getTask().getID().toString(); - stateURLFormat = - String.format("/proxy/%s/ws/v1/mapreduce/jobs/%s/tasks/%s/" - + "attempts", appID, jobID, taskID) + "/%s/state"; - - String current = - String.format("/proxy/%s/mapreduce/task/%s", appID, taskID); StringBuilder script = new StringBuilder(); - script.append("function confirmAction(stateURL) {") - .append(" b = confirm(\"Are you sure?\");") - .append(" if (b == true) {") - .append(" $.ajax({") - .append(" type: 'PUT',") - .append(" url: stateURL,") - .append(" contentType: 'application/json',") - .append(" data: '{\"state\":\"KILLED\"}',") - .append(" dataType: 'json'") - .append(" }).done(function(data){") - .append(" setTimeout(function(){") - .append(" location.href = '").append(current).append("';") - .append(" }, 1000);") - .append(" }).fail(function(data){") - .append(" console.log(data);") - .append(" });") - .append(" }") - .append("}"); + script + .append("function confirmAction(appID, jobID, taskID, attID) {\n") + .append(" var b = confirm(\"Are you sure?\");\n") + .append(" if (b == true) {\n") + .append(" var current = '/proxy/' + appID") + .append(" + '/mapreduce/task/' + taskID;\n") + .append(" var stateURL = '/proxy/' + appID") + .append(" + '/ws/v1/mapreduce/jobs/' + jobID") + .append(" + '/tasks/' + taskID") + .append(" + '/attempts/' + attID + '/state';\n") + .append(" $.ajax({\n") + .append(" type: 'PUT',\n") + .append(" url: stateURL,\n") + .append(" contentType: 'application/json',\n") + .append(" data: '{\"state\":\"KILLED\"}',\n") + .append(" dataType: 'json'\n") + .append(" }).done(function(data) {\n") + .append(" setTimeout(function() {\n") + .append(" location.href = current;\n") + .append(" }, 1000);\n") + .append(" }).fail(function(data) {\n") + .append(" console.log(data);\n") + .append(" });\n") + .append(" }\n") + .append("}\n"); html.script().$type("text/javascript")._(script.toString())._(); } @@ -135,8 +136,8 @@ public class TaskPage extends AppView { StringEscapeUtils.escapeHtml(ta.getStatus()))).append("\",\"") .append(nodeHttpAddr == null ? "N/A" : - "<a class='nodelink' href='" + MRWebAppUtil.getYARNWebappScheme() + nodeHttpAddr + "'>" - + nodeHttpAddr + "</a>") + "<a class='nodelink' href='" + MRWebAppUtil.getYARNWebappScheme() + nodeHttpAddr + "'>" + + nodeHttpAddr + "</a>") .append("\",\"") .append(ta.getAssignedContainerId() == null ? "N/A" : @@ -151,12 +152,21 @@ public class TaskPage extends AppView { .append(StringEscapeUtils.escapeJavaScript(StringEscapeUtils.escapeHtml( diag))); if (enableUIActions) { - attemptsTableData.append("\",\"") - .append("<a href=javascript:void(0) onclick=confirmAction('") - .append(String.format(stateURLFormat, ta.getId())) - .append("');>Kill</a>") - .append("\"],\n"); - } else { + attemptsTableData.append("\",\""); + if (EnumSet.of( + TaskAttemptState.SUCCEEDED, + TaskAttemptState.FAILED, + TaskAttemptState.KILLED).contains(attempt.getState())) { + attemptsTableData.append("N/A"); + } else { + attemptsTableData + .append("<a href=javascript:void(0) onclick=confirmAction('") + .append(jobId.getAppId()).append("','") + .append(jobId).append("','") + .append(attempt.getID().getTaskId()).append("','") + .append(ta.getId()) + .append("');>Kill</a>"); + } attemptsTableData.append("\"],\n"); } }