Skip to content

Commit 7f2ea2a

Browse files
author
prabhujoseph
committed
MAPREDUCE-7240. Fix Invalid event: TA_TOO_MANY_FETCH_FAILURE at SUCCESS_FINISHING_CONTAINER.
Contributed by Huachao and Peter Bacsko. Reviewed by Wilfred Spiegelenburg.
1 parent c8bef4d commit 7f2ea2a

File tree

2 files changed

+33
-0
lines changed
  • hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src

2 files changed

+33
-0
lines changed

hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/job/impl/TaskAttemptImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,10 @@ TaskAttemptEventType.TA_PREEMPTED, new PreemptedTransition())
382382
TaskAttemptStateInternal.SUCCESS_FINISHING_CONTAINER,
383383
TaskAttemptEventType.TA_DIAGNOSTICS_UPDATE,
384384
DIAGNOSTIC_INFORMATION_UPDATE_TRANSITION)
385+
.addTransition(TaskAttemptStateInternal.SUCCESS_FINISHING_CONTAINER,
386+
TaskAttemptStateInternal.FAILED,
387+
TaskAttemptEventType.TA_TOO_MANY_FETCH_FAILURE,
388+
new TooManyFetchFailureTransition())
385389
// ignore-able events
386390
.addTransition(TaskAttemptStateInternal.SUCCESS_FINISHING_CONTAINER,
387391
TaskAttemptStateInternal.SUCCESS_FINISHING_CONTAINER,
@@ -2148,6 +2152,10 @@ private static class TooManyFetchFailureTransition implements
21482152
@SuppressWarnings("unchecked")
21492153
@Override
21502154
public void transition(TaskAttemptImpl taskAttempt, TaskAttemptEvent event) {
2155+
if (taskAttempt.getInternalState() ==
2156+
TaskAttemptStateInternal.SUCCESS_FINISHING_CONTAINER) {
2157+
sendContainerCleanup(taskAttempt, event);
2158+
}
21512159
TaskAttemptTooManyFetchFailureEvent fetchFailureEvent =
21522160
(TaskAttemptTooManyFetchFailureEvent) event;
21532161
// too many fetch failure can only happen for map tasks

hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/job/impl/TestTaskAttempt.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1870,6 +1870,31 @@ private void initResourceTypes() {
18701870
.build());
18711871
}
18721872

1873+
@Test
1874+
public void testTooManyFetchFailureWhileSuccessFinishing() throws Exception {
1875+
MockEventHandler eventHandler = new MockEventHandler();
1876+
TaskAttemptImpl taImpl = createTaskAttemptImpl(eventHandler);
1877+
TaskId reducetaskId = MRBuilderUtils.newTaskId(taImpl.getID().getTaskId()
1878+
.getJobId(), 1, TaskType.REDUCE);
1879+
TaskAttemptId reduceTAId =
1880+
MRBuilderUtils.newTaskAttemptId(reducetaskId, 0);
1881+
1882+
taImpl.handle(new TaskAttemptEvent(taImpl.getID(),
1883+
TaskAttemptEventType.TA_DONE));
1884+
1885+
assertEquals("Task attempt's internal state is not " +
1886+
"SUCCESS_FINISHING_CONTAINER",
1887+
TaskAttemptStateInternal.SUCCESS_FINISHING_CONTAINER,
1888+
taImpl.getInternalState());
1889+
1890+
taImpl.handle(new TaskAttemptTooManyFetchFailureEvent(taImpl.getID(),
1891+
reduceTAId, "Host"));
1892+
assertEquals("Task attempt is not in FAILED state",
1893+
TaskAttemptState.FAILED,
1894+
taImpl.getState());
1895+
assertFalse("InternalError occurred", eventHandler.internalError);
1896+
}
1897+
18731898
private void setupTaskAttemptFinishingMonitor(
18741899
EventHandler eventHandler, JobConf jobConf, AppContext appCtx) {
18751900
TaskAttemptFinishingMonitor taskAttemptFinishingMonitor =

0 commit comments

Comments
 (0)