浏览代码

MAPREDUCE-7133. History Server task attempts REST API returns invalid data. Contributed by Oleksandr Shevchenko

(cherry picked from commit 2886024ac3a8613ecc27f1595b278ce6fc2d03ba)
Jason Lowe 6 年之前
父节点
当前提交
991461340a

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

@@ -16,6 +16,9 @@ Release 2.7.8 - UNRELEASED
     files from intermediate to finished but thinks file is in
     files from intermediate to finished but thinks file is in
     intermediate. (Anthony Hsu via jlowe)
     intermediate. (Anthony Hsu via jlowe)
 
 
+    MAPREDUCE-7133. History Server task attempts REST API returns invalid
+    data. (Oleksandr Shevchenko via jlowe)
+
 Release 2.7.7 - 2018-07-18
 Release 2.7.7 - 2018-07-18
 
 
   INCOMPATIBLE CHANGES
   INCOMPATIBLE CHANGES

+ 5 - 3
hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/dao/TaskAttemptsInfo.java

@@ -19,12 +19,10 @@ package org.apache.hadoop.mapreduce.v2.app.webapp.dao;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
 
 @XmlRootElement(name = "taskAttempts")
 @XmlRootElement(name = "taskAttempts")
-@XmlAccessorType(XmlAccessType.FIELD)
 public class TaskAttemptsInfo {
 public class TaskAttemptsInfo {
 
 
   protected ArrayList<TaskAttemptInfo> taskAttempt = new ArrayList<TaskAttemptInfo>();
   protected ArrayList<TaskAttemptInfo> taskAttempt = new ArrayList<TaskAttemptInfo>();
@@ -36,6 +34,10 @@ public class TaskAttemptsInfo {
     taskAttempt.add(taskattemptInfo);
     taskAttempt.add(taskattemptInfo);
   }
   }
 
 
+  // XmlElementRef annotation should be used to identify the exact type of a list element
+  // otherwise metadata will be added to XML attributes,
+  // it can lead to incorrect JSON marshaling
+  @XmlElementRef
   public ArrayList<TaskAttemptInfo> getTaskAttempts() {
   public ArrayList<TaskAttemptInfo> getTaskAttempts() {
     return taskAttempt;
     return taskAttempt;
   }
   }

+ 3 - 0
hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesAttempts.java

@@ -20,6 +20,7 @@
 package org.apache.hadoop.mapreduce.v2.app.webapp;
 package org.apache.hadoop.mapreduce.v2.app.webapp;
 
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.junit.Assert.fail;
@@ -477,6 +478,8 @@ public class TestAMWebServicesAttempts extends JerseyTest {
       Boolean found = false;
       Boolean found = false;
       for (int i = 0; i < nodes.getLength(); i++) {
       for (int i = 0; i < nodes.getLength(); i++) {
         Element element = (Element) nodes.item(i);
         Element element = (Element) nodes.item(i);
+        assertFalse("task attempt should not contain any attributes, it can lead to incorrect JSON marshaling",
+            element.hasAttributes());
 
 
         if (attid.matches(WebServicesTestUtils.getXmlString(element, "id"))) {
         if (attid.matches(WebServicesTestUtils.getXmlString(element, "id"))) {
           found = true;
           found = true;

+ 1 - 1
hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/site/markdown/MapredAppMasterRest.md

@@ -1888,7 +1888,7 @@ Response Body:
 
 
     <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
     <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
     <taskAttempts>
     <taskAttempts>
-      <taskAttempt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="reduceTaskAttemptInfo">
+      <taskAttempt>
         <startTime>1326238777460</startTime>
         <startTime>1326238777460</startTime>
         <finishTime>0</finishTime>
         <finishTime>0</finishTime>
         <elapsedTime>0</elapsedTime>
         <elapsedTime>0</elapsedTime>