From 4b21938a187c8860778fd19e9626411a3b49eabd Mon Sep 17 00:00:00 2001 From: Prabhu Joseph Date: Sat, 16 Feb 2019 11:00:18 +0530 Subject: [PATCH] YARN-8132 --- .../metrics/CombinedSystemMetricsPublisher.java | 6 ++-- .../metrics/NoOpSystemMetricPublisher.java | 4 ++- .../metrics/SystemMetricsPublisher.java | 4 ++- .../metrics/TimelineServiceV1Publisher.java | 6 ++-- .../metrics/TimelineServiceV2Publisher.java | 6 ++-- .../server/resourcemanager/rmapp/RMAppImpl.java | 6 +++- .../metrics/TestSystemMetricsPublisher.java | 2 +- .../metrics/TestSystemMetricsPublisherForV2.java | 3 +- .../rmapp/TestRMAppTransitions.java | 39 ++++++++++++---------- 9 files changed, 47 insertions(+), 29 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/CombinedSystemMetricsPublisher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/CombinedSystemMetricsPublisher.java index 8e04a1e..368c5b9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/CombinedSystemMetricsPublisher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/CombinedSystemMetricsPublisher.java @@ -21,6 +21,7 @@ import java.util.Collection; import org.apache.hadoop.yarn.api.records.YarnApplicationState; +import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt; @@ -74,9 +75,10 @@ public void appStateUpdated(RMApp app, YarnApplicationState appState, } @Override - public void appFinished(RMApp app, RMAppState state, long finishedTime) { + public void appFinished(RMApp app, RMAppState state, long finishedTime, + FinalApplicationStatus finalAppStatus) { for (SystemMetricsPublisher publisher : this.publishers) { - publisher.appFinished(app, state, finishedTime); + publisher.appFinished(app, state, finishedTime, finalAppStatus); } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/NoOpSystemMetricPublisher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/NoOpSystemMetricPublisher.java index 537c88c..d32e8a9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/NoOpSystemMetricPublisher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/NoOpSystemMetricPublisher.java @@ -22,6 +22,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptState; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer; +import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; import org.apache.hadoop.yarn.api.records.YarnApplicationState; /** * This class does nothing when any of the methods are invoked on @@ -34,7 +35,8 @@ public void appCreated(RMApp app, long createdTime) { } @Override - public void appFinished(RMApp app, RMAppState state, long finishedTime) { + public void appFinished(RMApp app, RMAppState state, long finishedTime, + FinalApplicationStatus finalAppStatus) { } @Override diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/SystemMetricsPublisher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/SystemMetricsPublisher.java index 137d790..503d58c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/SystemMetricsPublisher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/SystemMetricsPublisher.java @@ -18,6 +18,7 @@ package org.apache.hadoop.yarn.server.resourcemanager.metrics; +import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt; @@ -41,7 +42,8 @@ void appStateUpdated(RMApp app, YarnApplicationState appState, long updatedTime); - void appFinished(RMApp app, RMAppState state, long finishedTime); + void appFinished(RMApp app, RMAppState state, long finishedTime, + FinalApplicationStatus finalAppStatus); void appAttemptRegistered(RMAppAttempt appAttempt, long registeredTime); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TimelineServiceV1Publisher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TimelineServiceV1Publisher.java index dc5292b..e07a102 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TimelineServiceV1Publisher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TimelineServiceV1Publisher.java @@ -29,6 +29,7 @@ import org.apache.hadoop.yarn.api.records.YarnApplicationState; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerLaunchContext; +import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; import org.apache.hadoop.yarn.api.records.timeline.TimelineEntity; import org.apache.hadoop.yarn.api.records.timeline.TimelineEvent; import org.apache.hadoop.yarn.client.api.TimelineClient; @@ -122,7 +123,8 @@ public void appCreated(RMApp app, long createdTime) { } @Override - public void appFinished(RMApp app, RMAppState state, long finishedTime) { + public void appFinished(RMApp app, RMAppState state, long finishedTime, + FinalApplicationStatus finalAppStatus) { TimelineEntity entity = createApplicationEntity(app.getApplicationId()); TimelineEvent tEvent = new TimelineEvent(); @@ -132,7 +134,7 @@ public void appFinished(RMApp app, RMAppState state, long finishedTime) { eventInfo.put(ApplicationMetricsConstants.DIAGNOSTICS_INFO_EVENT_INFO, app.getDiagnostics().toString()); eventInfo.put(ApplicationMetricsConstants.FINAL_STATUS_EVENT_INFO, - app.getFinalApplicationStatus().toString()); + finalAppStatus.toString()); eventInfo.put(ApplicationMetricsConstants.STATE_EVENT_INFO, RMServerUtils.createApplicationState(state).toString()); String latestApplicationAttemptId = app.getCurrentAppAttempt() == null diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TimelineServiceV2Publisher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TimelineServiceV2Publisher.java index e93c26d..3ee2fc1 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TimelineServiceV2Publisher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TimelineServiceV2Publisher.java @@ -35,6 +35,7 @@ import org.apache.hadoop.yarn.api.records.YarnApplicationState; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerLaunchContext; +import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; import org.apache.hadoop.yarn.api.records.timelineservice.ApplicationAttemptEntity; import org.apache.hadoop.yarn.api.records.timelineservice.ApplicationEntity; import org.apache.hadoop.yarn.api.records.timelineservice.ContainerEntity; @@ -169,7 +170,8 @@ public void appLaunched(RMApp app, long launchTime) { @SuppressWarnings("unchecked") @Override - public void appFinished(RMApp app, RMAppState state, long finishedTime) { + public void appFinished(RMApp app, RMAppState state, long finishedTime, + FinalApplicationStatus finalAppStatus) { ApplicationEntity entity = createApplicationEntity(app.getApplicationId()); TimelineEvent tEvent = new TimelineEvent(); @@ -181,7 +183,7 @@ public void appFinished(RMApp app, RMAppState state, long finishedTime) { entityInfo.put(ApplicationMetricsConstants.DIAGNOSTICS_INFO_EVENT_INFO, app.getDiagnostics().toString()); entityInfo.put(ApplicationMetricsConstants.FINAL_STATUS_EVENT_INFO, - app.getFinalApplicationStatus().toString()); + finalAppStatus.toString()); entityInfo.put(ApplicationMetricsConstants.STATE_EVENT_INFO, RMServerUtils.createApplicationState(state).toString()); ApplicationAttemptId appAttemptId = app.getCurrentAppAttempt() == null diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/RMAppImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/RMAppImpl.java index 696b39d..acfdcd7 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/RMAppImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/RMAppImpl.java @@ -1543,8 +1543,12 @@ private void handleAppFinished(RMAppImpl app) { //record finish in history and metrics app.rmContext.getRMApplicationHistoryWriter() .applicationFinished(app, finalState); + FinalApplicationStatus finalAppStatus = app.getFinalApplicationStatus(); + if (FinalApplicationStatus.UNDEFINED == finalAppStatus) { + finalAppStatus = app.createFinalApplicationStatus(finalState); + } app.rmContext.getSystemMetricsPublisher() - .appFinished(app, finalState, app.finishTime); + .appFinished(app, finalState, app.finishTime, finalAppStatus); } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TestSystemMetricsPublisher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TestSystemMetricsPublisher.java index f2d82e9..7f9411c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TestSystemMetricsPublisher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TestSystemMetricsPublisher.java @@ -136,7 +136,7 @@ public void testPublishApplicationMetrics() throws Exception { metricsPublisher.appStateUpdated(app, YarnApplicationState.RUNNING, stateUpdateTimeStamp); metricsPublisher.appFinished(app, RMAppState.FINISHED, - app.getFinishTime()); + app.getFinishTime(), FinalApplicationStatus.UNDEFINED); if (i == 1) { metricsPublisher.appACLsUpdated(app, "uers1,user2", 4L); } else { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TestSystemMetricsPublisherForV2.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TestSystemMetricsPublisherForV2.java index ca3f47d..8bb2b4b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TestSystemMetricsPublisherForV2.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TestSystemMetricsPublisherForV2.java @@ -205,7 +205,8 @@ public void testPublishApplicationMetrics() throws Exception { metricsPublisher.appCreated(app, app.getStartTime()); metricsPublisher.appLaunched(app, app.getLaunchTime()); metricsPublisher.appACLsUpdated(app, "user1,user2", 4L); - metricsPublisher.appFinished(app, RMAppState.FINISHED, app.getFinishTime()); + metricsPublisher.appFinished(app, RMAppState.FINISHED, app.getFinishTime(), + FinalApplicationStatus.SUCCEEDED); dispatcher.await(); String outputDirApp = diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/TestRMAppTransitions.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/TestRMAppTransitions.java index 32dcd3b..d17420c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/TestRMAppTransitions.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/TestRMAppTransitions.java @@ -722,7 +722,7 @@ public void testAppNewKill() throws IOException { sendAppUpdateSavedEvent(application); assertKilled(application); assertAppFinalStateNotSaved(application); - verifyApplicationFinished(RMAppState.KILLED); + verifyApplicationFinished(RMAppState.KILLED, FinalApplicationStatus.KILLED); verifyAppRemovedSchedulerEvent(application, RMAppState.KILLED); verifyRMAppFieldsForFinalTransitions(application); } @@ -741,7 +741,7 @@ public void testAppNewReject() throws IOException { sendAppUpdateSavedEvent(application); assertFailed(application, rejectedText); assertAppFinalStateSaved(application); - verifyApplicationFinished(RMAppState.FAILED); + verifyApplicationFinished(RMAppState.FAILED, FinalApplicationStatus.FAILED); verifyRMAppFieldsForFinalTransitions(application); } @@ -759,7 +759,7 @@ public void testAppNewRejectAddToStore() throws IOException { sendAppUpdateSavedEvent(application); assertFailed(application, rejectedText); assertAppFinalStateSaved(application); - verifyApplicationFinished(RMAppState.FAILED); + verifyApplicationFinished(RMAppState.FAILED, FinalApplicationStatus.FAILED); verifyRMAppFieldsForFinalTransitions(application); rmContext.getStateStore().removeApplication(application); } @@ -781,7 +781,7 @@ public void testAppNewSavingKill() throws IOException { rmDispatcher.await(); sendAppUpdateSavedEvent(application); assertKilled(application); - verifyApplicationFinished(RMAppState.KILLED); + verifyApplicationFinished(RMAppState.KILLED, FinalApplicationStatus.KILLED); verifyAppRemovedSchedulerEvent(application, RMAppState.KILLED); verifyRMAppFieldsForFinalTransitions(application); } @@ -800,7 +800,7 @@ public void testAppNewSavingReject() throws IOException { sendAppUpdateSavedEvent(application); assertFailed(application, rejectedText); assertAppFinalStateSaved(application); - verifyApplicationFinished(RMAppState.FAILED); + verifyApplicationFinished(RMAppState.FAILED, FinalApplicationStatus.FAILED); verifyRMAppFieldsForFinalTransitions(application); } @@ -817,7 +817,7 @@ public void testAppNewSavingSaveReject() throws IOException { assertFailed(application, rejectedText); verify(store, times(0)).updateApplicationState( any(ApplicationStateData.class)); - verifyApplicationFinished(RMAppState.FAILED); + verifyApplicationFinished(RMAppState.FAILED, FinalApplicationStatus.FAILED); assertTimesAtFinish(application); } @@ -835,7 +835,7 @@ public void testAppSubmittedRejected() throws IOException { sendAppUpdateSavedEvent(application); assertFailed(application, rejectedText); assertAppFinalStateSaved(application); - verifyApplicationFinished(RMAppState.FAILED); + verifyApplicationFinished(RMAppState.FAILED, FinalApplicationStatus.FAILED); verifyRMAppFieldsForFinalTransitions(application); } @@ -857,7 +857,7 @@ public void testAppSubmittedKill() throws IOException, InterruptedException { sendAppUpdateSavedEvent(application); assertKilled(application); assertAppFinalStateSaved(application); - verifyApplicationFinished(RMAppState.KILLED); + verifyApplicationFinished(RMAppState.KILLED, FinalApplicationStatus.KILLED); verifyAppRemovedSchedulerEvent(application, RMAppState.KILLED); verifyRMAppFieldsForFinalTransitions(application); } @@ -894,7 +894,7 @@ public void testAppAcceptedFailed() throws IOException { sendAppUpdateSavedEvent(application); assertFailed(application, ".*" + message + ".*Failing the application.*"); assertAppFinalStateSaved(application); - verifyApplicationFinished(RMAppState.FAILED); + verifyApplicationFinished(RMAppState.FAILED, FinalApplicationStatus.FAILED); } @Test @@ -921,7 +921,7 @@ public void testAppAcceptedKill() throws IOException, InterruptedException { sendAppUpdateSavedEvent(application); assertKilled(application); assertAppFinalStateSaved(application); - verifyApplicationFinished(RMAppState.KILLED); + verifyApplicationFinished(RMAppState.KILLED, FinalApplicationStatus.KILLED); verifyAppRemovedSchedulerEvent(application, RMAppState.KILLED); verifyRMAppFieldsForFinalTransitions(application); } @@ -945,7 +945,7 @@ public void testAppAcceptedAttemptKilled() throws IOException, sendAppUpdateSavedEvent(application); assertKilled(application); assertAppFinalStateSaved(application); - verifyApplicationFinished(RMAppState.KILLED); + verifyApplicationFinished(RMAppState.KILLED, FinalApplicationStatus.KILLED); verifyAppRemovedSchedulerEvent(application, RMAppState.KILLED); } @@ -969,7 +969,7 @@ public void testAppRunningKill() throws IOException { sendAttemptUpdateSavedEvent(application); sendAppUpdateSavedEvent(application); assertKilled(application); - verifyApplicationFinished(RMAppState.KILLED); + verifyApplicationFinished(RMAppState.KILLED, FinalApplicationStatus.KILLED); verifyAppRemovedSchedulerEvent(application, RMAppState.KILLED); verifyRMAppFieldsForFinalTransitions(application); } @@ -1028,7 +1028,7 @@ public void testAppRunningFailed() throws IOException { rmDispatcher.await(); assertFailed(application, ".*Failing the application.*"); assertAppFinalStateSaved(application); - verifyApplicationFinished(RMAppState.FAILED); + verifyApplicationFinished(RMAppState.FAILED, FinalApplicationStatus.FAILED); verifyRMAppFieldsForFinalTransitions(application); } @@ -1090,7 +1090,9 @@ public void testAppFinishedFinished() throws Exception { StringBuilder diag = application.getDiagnostics(); Assert.assertEquals("application diagnostics is not correct", "", diag.toString()); - verifyApplicationFinished(RMAppState.FINISHED); + // finished without a proper final state is the same as failed + verifyApplicationFinished(RMAppState.FINISHED, + FinalApplicationStatus.FAILED); verifyAppRemovedSchedulerEvent(application, RMAppState.FINISHED); verifyRMAppFieldsForFinalTransitions(application); } @@ -1118,7 +1120,7 @@ public void testAppFailedFailed() throws IOException { rmDispatcher.await(); assertTimesAtFinish(application); assertAppState(RMAppState.FAILED, application); - verifyApplicationFinished(RMAppState.FAILED); + verifyApplicationFinished(RMAppState.FAILED, FinalApplicationStatus.FAILED); assertTimesAtFinish(application); assertAppState(RMAppState.FAILED, application); @@ -1173,7 +1175,7 @@ public void testAppKilledKilled() throws IOException { rmDispatcher.await(); assertTimesAtFinish(application); assertAppState(RMAppState.KILLED, application); - verifyApplicationFinished(RMAppState.KILLED); + verifyApplicationFinished(RMAppState.KILLED, FinalApplicationStatus.KILLED); assertTimesAtFinish(application); assertAppState(RMAppState.KILLED, application); @@ -1309,14 +1311,15 @@ private void verifyAppCompletedEvent(RMApp app) { rmAppManagerEvent.getApplicationId().getId()); } - private void verifyApplicationFinished(RMAppState state) { + private void verifyApplicationFinished(RMAppState state, + FinalApplicationStatus finalAppStatus) { ArgumentCaptor finalState = ArgumentCaptor.forClass(RMAppState.class); verify(writer).applicationFinished(any(RMApp.class), finalState.capture()); Assert.assertEquals(state, finalState.getValue()); finalState = ArgumentCaptor.forClass(RMAppState.class); verify(publisher).appFinished(any(RMApp.class), finalState.capture(), - anyLong()); + anyLong(), eq(finalAppStatus)); Assert.assertEquals(state, finalState.getValue()); } -- 2.7.4 (Apple Git-66)