Selaa lähdekoodia

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

(cherry picked from commit 2886024ac3a8613ecc27f1595b278ce6fc2d03ba)
Jason Lowe 6 vuotta sitten
vanhempi
commit
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
     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
 
   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 javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 @XmlRootElement(name = "taskAttempts")
-@XmlAccessorType(XmlAccessType.FIELD)
 public class TaskAttemptsInfo {
 
   protected ArrayList<TaskAttemptInfo> taskAttempt = new ArrayList<TaskAttemptInfo>();
@@ -36,6 +34,10 @@ public class TaskAttemptsInfo {
     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() {
     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;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -477,6 +478,8 @@ public class TestAMWebServicesAttempts extends JerseyTest {
       Boolean found = false;
       for (int i = 0; i < nodes.getLength(); 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"))) {
           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"?>
     <taskAttempts>
-      <taskAttempt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="reduceTaskAttemptInfo">
+      <taskAttempt>
         <startTime>1326238777460</startTime>
         <finishTime>0</finishTime>
         <elapsedTime>0</elapsedTime>