diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/ApplicationHistoryManagerOnTimelineStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/ApplicationHistoryManagerOnTimelineStore.java index 51e2356058e..aedf6f656b6 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/ApplicationHistoryManagerOnTimelineStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/ApplicationHistoryManagerOnTimelineStore.java @@ -358,6 +358,9 @@ private static ApplicationReportExt convertToApplicationReport( createdTime = event.getTimestamp(); } else if (event.getEventType().equals( ApplicationMetricsConstants.UPDATED_EVENT_TYPE)) { + // TODO: YARN-5101. This type of events are parsed in + // time-stamp descending order which means the previous event + // could override the information from the later same type of event. Map eventInfo = event.getEventInfo(); if (eventInfo == null) { continue; @@ -376,8 +379,10 @@ private static ApplicationReportExt convertToApplicationReport( } if (eventInfo.containsKey( ApplicationMetricsConstants.STATE_EVENT_INFO)) { - state = YarnApplicationState.valueOf(eventInfo.get( - ApplicationMetricsConstants.STATE_EVENT_INFO).toString()); + if (!isFinalState(state)) { + state = YarnApplicationState.valueOf(eventInfo.get( + ApplicationMetricsConstants.STATE_EVENT_INFO).toString()); + } } } else if (event.getEventType().equals( ApplicationMetricsConstants.FINISHED_EVENT_TYPE)) { @@ -429,6 +434,12 @@ private static ApplicationReportExt convertToApplicationReport( amNodeLabelExpression), appViewACLs); } + private static boolean isFinalState(YarnApplicationState state) { + return state == YarnApplicationState.FINISHED + || state == YarnApplicationState.FAILED + || state == YarnApplicationState.KILLED; + } + private static ApplicationAttemptReport convertToApplicationAttemptReport( TimelineEntity entity) { String host = null; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestApplicationHistoryManagerOnTimelineStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestApplicationHistoryManagerOnTimelineStore.java index 3c975842486..b65b22b4776 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestApplicationHistoryManagerOnTimelineStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestApplicationHistoryManagerOnTimelineStore.java @@ -537,6 +537,18 @@ private static TimelineEntity createApplicationTimelineEntity( } tEvent.setEventInfo(eventInfo); entity.addEvent(tEvent); + // send a YARN_APPLICATION_STATE_UPDATED event + // after YARN_APPLICATION_FINISHED + // The final YarnApplicationState should not be changed + tEvent = new TimelineEvent(); + tEvent.setEventType( + ApplicationMetricsConstants.STATE_UPDATED_EVENT_TYPE); + tEvent.setTimestamp(Integer.MAX_VALUE + 4L + appId.getId()); + eventInfo = new HashMap(); + eventInfo.put(ApplicationMetricsConstants.STATE_EVENT_INFO, + YarnApplicationState.KILLED); + tEvent.setEventInfo(eventInfo); + entity.addEvent(tEvent); if (enableUpdateEvent) { tEvent = new TimelineEvent(); createAppModifiedEvent(appId, tEvent, "changed queue", 5);