MAPREDUCE-7249. Fix Invalid event TA_TOO_MANY_FETCH_FAILURE at SUCCESS_CONTAINER_CLEANUP causes job failure.
Contributed by Wilfred Spiegelenburg.
This commit is contained in:
parent
2b452b4e60
commit
013c6e51b6
@ -475,12 +475,16 @@ TaskAttemptEventType.TA_CONTAINER_CLEANED, new KilledTransition())
|
|||||||
TaskAttemptStateInternal.COMMIT_PENDING,
|
TaskAttemptStateInternal.COMMIT_PENDING,
|
||||||
TaskAttemptEventType.TA_COMMIT_PENDING)
|
TaskAttemptEventType.TA_COMMIT_PENDING)
|
||||||
|
|
||||||
// Transitions from SUCCESS_CONTAINER_CLEANUP state
|
// Transitions from SUCCESS_CONTAINER_CLEANUP state
|
||||||
// kill and cleanup the container
|
// kill and cleanup the container
|
||||||
.addTransition(TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
|
.addTransition(TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
|
||||||
TaskAttemptStateInternal.SUCCEEDED,
|
TaskAttemptStateInternal.SUCCEEDED,
|
||||||
TaskAttemptEventType.TA_CONTAINER_CLEANED)
|
TaskAttemptEventType.TA_CONTAINER_CLEANED)
|
||||||
.addTransition(
|
.addTransition(TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
|
||||||
|
TaskAttemptStateInternal.FAILED,
|
||||||
|
TaskAttemptEventType.TA_TOO_MANY_FETCH_FAILURE,
|
||||||
|
new TooManyFetchFailureTransition())
|
||||||
|
.addTransition(
|
||||||
TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
|
TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
|
||||||
TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
|
TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
|
||||||
TaskAttemptEventType.TA_DIAGNOSTICS_UPDATE,
|
TaskAttemptEventType.TA_DIAGNOSTICS_UPDATE,
|
||||||
|
@ -1863,6 +1863,38 @@ public void testReducerCustomResourceTypeWithInvalidUnit() {
|
|||||||
createReduceTaskAttemptImplForTest(eventHandler, clock, jobConf);
|
createReduceTaskAttemptImplForTest(eventHandler, clock, jobConf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTooManyFetchFailureWhileContainerCleanup() {
|
||||||
|
MockEventHandler eventHandler = new MockEventHandler();
|
||||||
|
TaskAttemptImpl taImpl = createTaskAttemptImpl(eventHandler);
|
||||||
|
TaskId reducetaskId = MRBuilderUtils.newTaskId(taImpl.getID().getTaskId()
|
||||||
|
.getJobId(), 1, TaskType.REDUCE);
|
||||||
|
TaskAttemptId reduceTAId =
|
||||||
|
MRBuilderUtils.newTaskAttemptId(reducetaskId, 0);
|
||||||
|
|
||||||
|
// move in two steps to the desired state (cannot get there directly)
|
||||||
|
taImpl.handle(new TaskAttemptEvent(taImpl.getID(),
|
||||||
|
TaskAttemptEventType.TA_DONE));
|
||||||
|
assertEquals("Task attempt's internal state is not " +
|
||||||
|
"SUCCESS_FINISHING_CONTAINER",
|
||||||
|
TaskAttemptStateInternal.SUCCESS_FINISHING_CONTAINER,
|
||||||
|
taImpl.getInternalState());
|
||||||
|
|
||||||
|
taImpl.handle(new TaskAttemptEvent(taImpl.getID(),
|
||||||
|
TaskAttemptEventType.TA_TIMED_OUT));
|
||||||
|
assertEquals("Task attempt's internal state is not " +
|
||||||
|
"SUCCESS_CONTAINER_CLEANUP",
|
||||||
|
TaskAttemptStateInternal.SUCCESS_CONTAINER_CLEANUP,
|
||||||
|
taImpl.getInternalState());
|
||||||
|
|
||||||
|
taImpl.handle(new TaskAttemptTooManyFetchFailureEvent(taImpl.getID(),
|
||||||
|
reduceTAId, "Host"));
|
||||||
|
assertEquals("Task attempt is not in FAILED state",
|
||||||
|
TaskAttemptState.FAILED,
|
||||||
|
taImpl.getState());
|
||||||
|
assertFalse("InternalError occurred", eventHandler.internalError);
|
||||||
|
}
|
||||||
|
|
||||||
private void initResourceTypes() {
|
private void initResourceTypes() {
|
||||||
CustomResourceTypesConfigurationProvider.initResourceTypes(
|
CustomResourceTypesConfigurationProvider.initResourceTypes(
|
||||||
ImmutableMap.<String, String>builder()
|
ImmutableMap.<String, String>builder()
|
||||||
|
Loading…
Reference in New Issue
Block a user