|
@@ -22,6 +22,7 @@ import org.apache.dolphinscheduler.common.enums.DependentRelation;
|
|
|
import org.apache.dolphinscheduler.common.enums.ExecutionStatus;
|
|
|
import org.apache.dolphinscheduler.common.model.DateInterval;
|
|
|
import org.apache.dolphinscheduler.common.model.DependentItem;
|
|
|
+import org.apache.dolphinscheduler.common.model.TaskNode;
|
|
|
import org.apache.dolphinscheduler.common.utils.DependentUtils;
|
|
|
import org.apache.dolphinscheduler.dao.entity.ProcessInstance;
|
|
|
import org.apache.dolphinscheduler.dao.entity.TaskInstance;
|
|
@@ -82,7 +83,7 @@ public class DependentExecute {
|
|
|
* @param currentTime current time
|
|
|
* @return DependResult
|
|
|
*/
|
|
|
- public DependResult getDependentResultForItem(DependentItem dependentItem, Date currentTime){
|
|
|
+ private DependResult getDependentResultForItem(DependentItem dependentItem, Date currentTime){
|
|
|
List<DateInterval> dateIntervals = DependentUtils.getDateIntervalList(currentTime, dependentItem.getDateValue());
|
|
|
return calculateResultForTasks(dependentItem, dateIntervals );
|
|
|
}
|
|
@@ -94,7 +95,8 @@ public class DependentExecute {
|
|
|
* @return dateIntervals
|
|
|
*/
|
|
|
private DependResult calculateResultForTasks(DependentItem dependentItem,
|
|
|
- List<DateInterval> dateIntervals) {
|
|
|
+ List<DateInterval> dateIntervals) {
|
|
|
+
|
|
|
DependResult result = DependResult.FAILED;
|
|
|
for(DateInterval dateInterval : dateIntervals){
|
|
|
ProcessInstance processInstance = findLastProcessInterval(dependentItem.getDefinitionId(),
|
|
@@ -104,25 +106,35 @@ public class DependentExecute {
|
|
|
dependentItem.getDefinitionId(), dateInterval.getStartTime(), dateInterval.getEndTime() );
|
|
|
return DependResult.FAILED;
|
|
|
}
|
|
|
+ // need to check workflow for updates, so get all task and check the task state
|
|
|
if(dependentItem.getDepTasks().equals(Constants.DEPENDENT_ALL)){
|
|
|
- result = getDependResultByState(processInstance.getState());
|
|
|
- }else{
|
|
|
- TaskInstance taskInstance = null;
|
|
|
- List<TaskInstance> taskInstanceList = processService.findValidTaskListByProcessId(processInstance.getId());
|
|
|
+ List<TaskNode> taskNodes =
|
|
|
+ processService.getTaskNodeListByDefinitionId(dependentItem.getDefinitionId());
|
|
|
|
|
|
- for(TaskInstance task : taskInstanceList){
|
|
|
- if(task.getName().equals(dependentItem.getDepTasks())){
|
|
|
- taskInstance = task;
|
|
|
- break;
|
|
|
+ if(taskNodes != null && taskNodes.size() > 0){
|
|
|
+ List<DependResult> results = new ArrayList<>();
|
|
|
+ DependResult tmpResult = DependResult.FAILED;
|
|
|
+ for(TaskNode taskNode:taskNodes){
|
|
|
+ tmpResult = getDependTaskResult(taskNode.getName(),processInstance);
|
|
|
+ if(DependResult.FAILED == tmpResult){
|
|
|
+ break;
|
|
|
+ }else{
|
|
|
+ results.add(getDependTaskResult(taskNode.getName(),processInstance));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(DependResult.FAILED == tmpResult){
|
|
|
+ result = DependResult.FAILED;
|
|
|
+ }else if(results.contains(DependResult.WAITING)){
|
|
|
+ result = DependResult.WAITING;
|
|
|
+ }else{
|
|
|
+ result = DependResult.SUCCESS;
|
|
|
}
|
|
|
- }
|
|
|
- if(taskInstance == null){
|
|
|
- // cannot find task in the process instance
|
|
|
- // maybe because process instance is running or failed.
|
|
|
- result = getDependResultByState(processInstance.getState());
|
|
|
}else{
|
|
|
- result = getDependResultByState(taskInstance.getState());
|
|
|
+ result = DependResult.FAILED;
|
|
|
}
|
|
|
+ }else{
|
|
|
+ result = getDependTaskResult(dependentItem.getDepTasks(),processInstance);
|
|
|
}
|
|
|
if(result != DependResult.SUCCESS){
|
|
|
break;
|
|
@@ -131,6 +143,35 @@ public class DependentExecute {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * get depend task result
|
|
|
+ * @param taskName
|
|
|
+ * @param processInstance
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private DependResult getDependTaskResult(String taskName, ProcessInstance processInstance) {
|
|
|
+ DependResult result = DependResult.FAILED;
|
|
|
+ TaskInstance taskInstance = null;
|
|
|
+ List<TaskInstance> taskInstanceList = processService.findValidTaskListByProcessId(processInstance.getId());
|
|
|
+
|
|
|
+ for(TaskInstance task : taskInstanceList){
|
|
|
+ if(task.getName().equals(taskName)){
|
|
|
+ taskInstance = task;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(taskInstance == null){
|
|
|
+ // cannot find task in the process instance
|
|
|
+ // maybe because process instance is running or failed.
|
|
|
+ result = getDependResultByProcessStateWhenTaskNull(processInstance.getState());
|
|
|
+ }else{
|
|
|
+ result = getDependResultByState(taskInstance.getState());
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* find the last one process instance that :
|
|
|
* 1. manual run and finish between the interval
|
|
@@ -172,7 +213,9 @@ public class DependentExecute {
|
|
|
*/
|
|
|
private DependResult getDependResultByState(ExecutionStatus state) {
|
|
|
|
|
|
- if(state.typeIsRunning() || state == ExecutionStatus.SUBMITTED_SUCCESS || state == ExecutionStatus.WAITTING_THREAD){
|
|
|
+ if(state.typeIsRunning()
|
|
|
+ || state == ExecutionStatus.SUBMITTED_SUCCESS
|
|
|
+ || state == ExecutionStatus.WAITTING_THREAD){
|
|
|
return DependResult.WAITING;
|
|
|
}else if(state.typeIsSuccess()){
|
|
|
return DependResult.SUCCESS;
|
|
@@ -181,6 +224,22 @@ public class DependentExecute {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * get dependent result by task instance state when task instance is null
|
|
|
+ * @param state state
|
|
|
+ * @return DependResult
|
|
|
+ */
|
|
|
+ private DependResult getDependResultByProcessStateWhenTaskNull(ExecutionStatus state) {
|
|
|
+
|
|
|
+ if(state.typeIsRunning()
|
|
|
+ || state == ExecutionStatus.SUBMITTED_SUCCESS
|
|
|
+ || state == ExecutionStatus.WAITTING_THREAD){
|
|
|
+ return DependResult.WAITING;
|
|
|
+ }else{
|
|
|
+ return DependResult.FAILED;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* judge depend item finished
|
|
|
* @param currentTime current time
|
|
@@ -222,7 +281,7 @@ public class DependentExecute {
|
|
|
* @param currentTime current time
|
|
|
* @return DependResult
|
|
|
*/
|
|
|
- public DependResult getDependResultForItem(DependentItem item, Date currentTime){
|
|
|
+ private DependResult getDependResultForItem(DependentItem item, Date currentTime){
|
|
|
String key = item.getKey();
|
|
|
if(dependResultMap.containsKey(key)){
|
|
|
return dependResultMap.get(key);
|