From c8843cac03b8eba2d7b0b9fde8caffff66dfc499 Mon Sep 17 00:00:00 2001 From: Junping Du Date: Thu, 19 May 2016 09:13:29 -0700 Subject: [PATCH] YARN-5100. The YarnApplicationState is always running in ATS even application is finished. Contributed by Xuan Gong. (cherry picked from commit 141873ca7d68619e3458712b17aed57fec8fd7c8) (cherry picked from commit 416274b53eefb76cf9d3dc2992d3e22b304c321e) --- .../ApplicationHistoryManagerOnTimelineStore.java | 15 +++++++++++++-- ...tApplicationHistoryManagerOnTimelineStore.java | 12 ++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) 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 @@ public class ApplicationHistoryManagerOnTimelineStore extends AbstractService 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 @@ public class ApplicationHistoryManagerOnTimelineStore extends AbstractService } 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 @@ public class ApplicationHistoryManagerOnTimelineStore extends AbstractService 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 @@ public class TestApplicationHistoryManagerOnTimelineStore { } 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);