Skip to content

Commit e395711

Browse files
committed
MAPREDUCE-7353: Mapreduce job fails when NM is stopped. Contributed by Bilwa S T (BilwaST)
(cherry picked from commit 7581413)
1 parent 99cff01 commit e395711

File tree

2 files changed

+36
-1
lines changed
  • hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src

2 files changed

+36
-1
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: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,10 +492,15 @@ TaskAttemptEventType.TA_CONTAINER_CLEANED, new KilledTransition())
492492
TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
493493
TaskAttemptEventType.TA_DIAGNOSTICS_UPDATE,
494494
DIAGNOSTIC_INFORMATION_UPDATE_TRANSITION)
495+
.addTransition(TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
496+
EnumSet.of(TaskAttemptStateInternal.SUCCEEDED,
497+
TaskAttemptStateInternal.KILLED),
498+
TaskAttemptEventType.TA_KILL,
499+
new KilledAfterSuccessTransition())
495500
// Ignore-able events
496501
.addTransition(TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
497502
TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
498-
EnumSet.of(TaskAttemptEventType.TA_KILL,
503+
EnumSet.of(
499504
TaskAttemptEventType.TA_FAILMSG,
500505
TaskAttemptEventType.TA_FAILMSG_BY_CLIENT,
501506
TaskAttemptEventType.TA_TIMED_OUT,

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: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1870,6 +1870,36 @@ public void testReducerCustomResourceTypeWithInvalidUnit() {
18701870
createReduceTaskAttemptImplForTest(eventHandler, clock, jobConf);
18711871
}
18721872

1873+
@Test
1874+
public void testKillingTaskWhenContainerCleanup() {
1875+
MockEventHandler eventHandler = new MockEventHandler();
1876+
TaskAttemptImpl taImpl = createTaskAttemptImpl(eventHandler);
1877+
TaskId maptaskId = MRBuilderUtils.newTaskId(taImpl.getID().getTaskId()
1878+
.getJobId(), 1, TaskType.MAP);
1879+
TaskAttemptId mapTAId =
1880+
MRBuilderUtils.newTaskAttemptId(maptaskId, 0);
1881+
1882+
// move in two steps to the desired state (cannot get there directly)
1883+
taImpl.handle(new TaskAttemptEvent(taImpl.getID(),
1884+
TaskAttemptEventType.TA_DONE));
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 TaskAttemptEvent(taImpl.getID(),
1891+
TaskAttemptEventType.TA_TIMED_OUT));
1892+
assertEquals("Task attempt's internal state is not " +
1893+
"SUCCESS_CONTAINER_CLEANUP",
1894+
TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
1895+
taImpl.getInternalState());
1896+
1897+
taImpl.handle(new TaskAttemptKillEvent(mapTAId, "", true));
1898+
assertEquals("Task attempt is not in KILLED state",
1899+
TaskAttemptState.KILLED,
1900+
taImpl.getState());
1901+
}
1902+
18731903
@Test
18741904
public void testTooManyFetchFailureWhileContainerCleanup() {
18751905
MockEventHandler eventHandler = new MockEventHandler();

0 commit comments

Comments
 (0)