[Fix-14149][master] task finished so not dispatch (#14161)
This commit is contained in:
parent
33525a17c3
commit
7ae4fb3787
|
|
@ -82,6 +82,7 @@ import org.apache.dolphinscheduler.server.master.graph.IWorkflowGraph;
|
||||||
import org.apache.dolphinscheduler.server.master.metrics.TaskMetrics;
|
import org.apache.dolphinscheduler.server.master.metrics.TaskMetrics;
|
||||||
import org.apache.dolphinscheduler.server.master.runner.execute.DefaultTaskExecuteRunnable;
|
import org.apache.dolphinscheduler.server.master.runner.execute.DefaultTaskExecuteRunnable;
|
||||||
import org.apache.dolphinscheduler.server.master.runner.execute.DefaultTaskExecuteRunnableFactory;
|
import org.apache.dolphinscheduler.server.master.runner.execute.DefaultTaskExecuteRunnableFactory;
|
||||||
|
import org.apache.dolphinscheduler.server.master.runner.execute.TaskExecuteRunnable;
|
||||||
import org.apache.dolphinscheduler.server.master.utils.TaskUtils;
|
import org.apache.dolphinscheduler.server.master.utils.TaskUtils;
|
||||||
import org.apache.dolphinscheduler.server.master.utils.WorkflowInstanceUtils;
|
import org.apache.dolphinscheduler.server.master.utils.WorkflowInstanceUtils;
|
||||||
import org.apache.dolphinscheduler.service.alert.ProcessAlertManager;
|
import org.apache.dolphinscheduler.service.alert.ProcessAlertManager;
|
||||||
|
|
@ -122,6 +123,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
|
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
|
@ -983,7 +985,7 @@ public class WorkflowExecuteRunnable implements IWorkflowExecuteRunnable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 4. submit to dispatch queue
|
// 4. submit to dispatch queue
|
||||||
taskExecuteRunnable.dispatch();
|
tryToDispatchTaskInstance(taskInstance, taskExecuteRunnable);
|
||||||
|
|
||||||
stateWheelExecuteThread.addTask4TimeoutCheck(workflowInstance, taskInstance);
|
stateWheelExecuteThread.addTask4TimeoutCheck(workflowInstance, taskInstance);
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -996,6 +998,35 @@ public class WorkflowExecuteRunnable implements IWorkflowExecuteRunnable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sometimes (such as pause), if the task instance status has already been finished,
|
||||||
|
* there is no need to dispatch it
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
void tryToDispatchTaskInstance(TaskInstance taskInstance, TaskExecuteRunnable taskExecuteRunnable) {
|
||||||
|
if (!taskInstance.getState().isFinished()) {
|
||||||
|
taskExecuteRunnable.dispatch();
|
||||||
|
} else {
|
||||||
|
if (workflowExecuteContext.getWorkflowInstance().isBlocked()) {
|
||||||
|
TaskStateEvent processBlockEvent = TaskStateEvent.builder()
|
||||||
|
.processInstanceId(workflowExecuteContext.getWorkflowInstance().getId())
|
||||||
|
.taskInstanceId(taskInstance.getId())
|
||||||
|
.status(taskInstance.getState())
|
||||||
|
.type(StateEventType.PROCESS_BLOCKED)
|
||||||
|
.build();
|
||||||
|
this.stateEvents.add(processBlockEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskStateEvent taskStateChangeEvent = TaskStateEvent.builder()
|
||||||
|
.processInstanceId(workflowExecuteContext.getWorkflowInstance().getId())
|
||||||
|
.taskInstanceId(taskInstance.getId())
|
||||||
|
.status(taskInstance.getState())
|
||||||
|
.type(StateEventType.TASK_STATE_CHANGE)
|
||||||
|
.build();
|
||||||
|
this.stateEvents.add(taskStateChangeEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* find task instance in db.
|
* find task instance in db.
|
||||||
* in case submit more than one same name task in the same time.
|
* in case submit more than one same name task in the same time.
|
||||||
|
|
|
||||||
|
|
@ -35,9 +35,11 @@ import org.apache.dolphinscheduler.dao.entity.TaskInstance;
|
||||||
import org.apache.dolphinscheduler.dao.repository.ProcessInstanceDao;
|
import org.apache.dolphinscheduler.dao.repository.ProcessInstanceDao;
|
||||||
import org.apache.dolphinscheduler.dao.repository.TaskDefinitionLogDao;
|
import org.apache.dolphinscheduler.dao.repository.TaskDefinitionLogDao;
|
||||||
import org.apache.dolphinscheduler.dao.repository.TaskInstanceDao;
|
import org.apache.dolphinscheduler.dao.repository.TaskInstanceDao;
|
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.enums.TaskExecutionStatus;
|
||||||
import org.apache.dolphinscheduler.server.master.config.MasterConfig;
|
import org.apache.dolphinscheduler.server.master.config.MasterConfig;
|
||||||
import org.apache.dolphinscheduler.server.master.graph.IWorkflowGraph;
|
import org.apache.dolphinscheduler.server.master.graph.IWorkflowGraph;
|
||||||
import org.apache.dolphinscheduler.server.master.runner.execute.DefaultTaskExecuteRunnableFactory;
|
import org.apache.dolphinscheduler.server.master.runner.execute.DefaultTaskExecuteRunnableFactory;
|
||||||
|
import org.apache.dolphinscheduler.server.master.runner.execute.TaskExecuteRunnable;
|
||||||
import org.apache.dolphinscheduler.service.alert.ProcessAlertManager;
|
import org.apache.dolphinscheduler.service.alert.ProcessAlertManager;
|
||||||
import org.apache.dolphinscheduler.service.bean.SpringApplicationContext;
|
import org.apache.dolphinscheduler.service.bean.SpringApplicationContext;
|
||||||
import org.apache.dolphinscheduler.service.command.CommandService;
|
import org.apache.dolphinscheduler.service.command.CommandService;
|
||||||
|
|
@ -371,4 +373,20 @@ public class WorkflowExecuteRunnableTest {
|
||||||
return schedulerList;
|
return schedulerList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testTryToDispatchTaskInstance() {
|
||||||
|
// task instance already finished, not dispatch
|
||||||
|
TaskInstance taskInstance = new TaskInstance();
|
||||||
|
taskInstance.setState(TaskExecutionStatus.PAUSE);
|
||||||
|
Mockito.when(processInstance.isBlocked()).thenReturn(true);
|
||||||
|
TaskExecuteRunnable taskExecuteRunnable = Mockito.mock(TaskExecuteRunnable.class);
|
||||||
|
workflowExecuteThread.tryToDispatchTaskInstance(taskInstance, taskExecuteRunnable);
|
||||||
|
Mockito.verify(taskExecuteRunnable, Mockito.never()).dispatch();
|
||||||
|
|
||||||
|
// submit success should dispatch
|
||||||
|
taskInstance = new TaskInstance();
|
||||||
|
taskInstance.setState(TaskExecutionStatus.SUBMITTED_SUCCESS);
|
||||||
|
workflowExecuteThread.tryToDispatchTaskInstance(taskInstance, taskExecuteRunnable);
|
||||||
|
Mockito.verify(taskExecuteRunnable).dispatch();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue