|
@@ -189,7 +189,7 @@ public abstract class TaskImpl implements Task, EventHandler<TaskEvent> {
|
|
|
|
|
|
// Transitions from SUCCEEDED state
|
|
// Transitions from SUCCEEDED state
|
|
.addTransition(TaskState.SUCCEEDED, //only possible for map tasks
|
|
.addTransition(TaskState.SUCCEEDED, //only possible for map tasks
|
|
- EnumSet.of(TaskState.SCHEDULED, TaskState.FAILED),
|
|
|
|
|
|
+ EnumSet.of(TaskState.SCHEDULED, TaskState.SUCCEEDED, TaskState.FAILED),
|
|
TaskEventType.T_ATTEMPT_FAILED, new MapRetroactiveFailureTransition())
|
|
TaskEventType.T_ATTEMPT_FAILED, new MapRetroactiveFailureTransition())
|
|
.addTransition(TaskState.SUCCEEDED, //only possible for map tasks
|
|
.addTransition(TaskState.SUCCEEDED, //only possible for map tasks
|
|
EnumSet.of(TaskState.SCHEDULED, TaskState.SUCCEEDED),
|
|
EnumSet.of(TaskState.SCHEDULED, TaskState.SUCCEEDED),
|
|
@@ -618,7 +618,7 @@ public abstract class TaskImpl implements Task, EventHandler<TaskEvent> {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- private void internalError(TaskEventType type) {
|
|
|
|
|
|
+ protected void internalError(TaskEventType type) {
|
|
LOG.error("Invalid event " + type + " on Task " + this.taskId);
|
|
LOG.error("Invalid event " + type + " on Task " + this.taskId);
|
|
eventHandler.handle(new JobDiagnosticsUpdateEvent(
|
|
eventHandler.handle(new JobDiagnosticsUpdateEvent(
|
|
this.taskId.getJobId(), "Invalid event " + type +
|
|
this.taskId.getJobId(), "Invalid event " + type +
|
|
@@ -896,6 +896,16 @@ public abstract class TaskImpl implements Task, EventHandler<TaskEvent> {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public TaskState transition(TaskImpl task, TaskEvent event) {
|
|
public TaskState transition(TaskImpl task, TaskEvent event) {
|
|
|
|
+ if (event instanceof TaskTAttemptEvent) {
|
|
|
|
+ TaskTAttemptEvent castEvent = (TaskTAttemptEvent) event;
|
|
|
|
+ if (task.getState() == TaskState.SUCCEEDED &&
|
|
|
|
+ !castEvent.getTaskAttemptID().equals(task.successfulAttempt)) {
|
|
|
|
+ // don't allow a different task attempt to override a previous
|
|
|
|
+ // succeeded state
|
|
|
|
+ return TaskState.SUCCEEDED;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
//verify that this occurs only for map task
|
|
//verify that this occurs only for map task
|
|
//TODO: consider moving it to MapTaskImpl
|
|
//TODO: consider moving it to MapTaskImpl
|
|
if (!TaskType.MAP.equals(task.getType())) {
|
|
if (!TaskType.MAP.equals(task.getType())) {
|