This is an automated email from the ASF dual-hosted git repository.

leonbao pushed a commit to branch 2.0.1-prepare
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/2.0.1-prepare by this push:
     new c2d0acd  fix timeout (#7222)
c2d0acd is described below

commit c2d0acd7139e5472da0de0b8e25636396442c0f5
Author: wind <[email protected]>
AuthorDate: Mon Dec 6 20:40:54 2021 +0800

    fix timeout (#7222)
    
    Co-authored-by: caishunfeng <[email protected]>
---
 .../master/runner/MasterSchedulerService.java      |  11 ++-
 .../master/runner/StateWheelExecuteThread.java     | 101 +++++++++++---------
 .../master/runner/WorkflowExecuteThread.java       | 105 ++++++++++++++++-----
 .../server/master/WorkflowExecuteThreadTest.java   |   7 +-
 4 files changed, 149 insertions(+), 75 deletions(-)

diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/MasterSchedulerService.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/MasterSchedulerService.java
index 803ba09..22ae759 100644
--- 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/MasterSchedulerService.java
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/MasterSchedulerService.java
@@ -109,6 +109,11 @@ public class MasterSchedulerService extends Thread {
     ConcurrentHashMap<Integer, TaskInstance> taskTimeoutCheckList = new 
ConcurrentHashMap<>();
 
     /**
+     * task retry check list
+     */
+    ConcurrentHashMap<Integer, TaskInstance> taskRetryCheckList = new 
ConcurrentHashMap<>();
+
+    /**
      * key:code-version
      * value: processDefinition
      */
@@ -127,6 +132,7 @@ public class MasterSchedulerService extends Thread {
 
         stateWheelExecuteThread = new 
StateWheelExecuteThread(processTimeoutCheckList,
                 taskTimeoutCheckList,
+                taskRetryCheckList,
                 this.processInstanceExecMaps,
                 masterConfig.getStateWheelInterval() * 
Constants.SLEEP_TIME_MILLIS);
     }
@@ -176,8 +182,6 @@ public class MasterSchedulerService extends Thread {
     /**
      * 1. get command by slot
      * 2. donot handle command if slot is empty
-     *
-     * @throws Exception
      */
     private void scheduleProcess() throws Exception {
 
@@ -201,7 +205,8 @@ public class MasterSchedulerService extends Thread {
                             , nettyExecutorManager
                             , processAlertManager
                             , masterConfig
-                            , taskTimeoutCheckList);
+                            , taskTimeoutCheckList
+                            , taskRetryCheckList);
 
                     this.processInstanceExecMaps.put(processInstance.getId(), 
workflowExecuteThread);
                     if (processInstance.getTimeout() > 0) {
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/StateWheelExecuteThread.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/StateWheelExecuteThread.java
index 50406cc..d0e9d94 100644
--- 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/StateWheelExecuteThread.java
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/StateWheelExecuteThread.java
@@ -42,18 +42,21 @@ public class StateWheelExecuteThread extends Thread {
 
     private static final Logger logger = 
LoggerFactory.getLogger(StateWheelExecuteThread.class);
 
-    ConcurrentHashMap<Integer, ProcessInstance> processInstanceCheckList;
-    ConcurrentHashMap<Integer, TaskInstance> taskInstanceCheckList;
+    private ConcurrentHashMap<Integer, ProcessInstance> 
processInstanceTimeoutCheckList;
+    private ConcurrentHashMap<Integer, TaskInstance> 
taskInstanceTimeoutCheckList;
+    private ConcurrentHashMap<Integer, TaskInstance> 
taskInstanceRetryCheckList;
     private ConcurrentHashMap<Integer, WorkflowExecuteThread> 
processInstanceExecMaps;
 
     private int stateCheckIntervalSecs;
 
-    public StateWheelExecuteThread(ConcurrentHashMap<Integer, ProcessInstance> 
processInstances,
-                                   ConcurrentHashMap<Integer, TaskInstance> 
taskInstances,
+    public StateWheelExecuteThread(ConcurrentHashMap<Integer, ProcessInstance> 
processInstanceTimeoutCheckList,
+                                   ConcurrentHashMap<Integer, TaskInstance> 
taskInstanceTimeoutCheckList,
+                                   ConcurrentHashMap<Integer, TaskInstance> 
taskInstanceRetryCheckList,
                                    ConcurrentHashMap<Integer, 
WorkflowExecuteThread> processInstanceExecMaps,
                                    int stateCheckIntervalSecs) {
-        this.processInstanceCheckList = processInstances;
-        this.taskInstanceCheckList = taskInstances;
+        this.processInstanceTimeoutCheckList = processInstanceTimeoutCheckList;
+        this.taskInstanceTimeoutCheckList = taskInstanceTimeoutCheckList;
+        this.taskInstanceRetryCheckList = taskInstanceRetryCheckList;
         this.processInstanceExecMaps = processInstanceExecMaps;
         this.stateCheckIntervalSecs = stateCheckIntervalSecs;
     }
@@ -64,8 +67,9 @@ public class StateWheelExecuteThread extends Thread {
         logger.info("state wheel thread start");
         while (Stopper.isRunning()) {
             try {
-                checkProcess();
-                checkTask();
+                checkTask4Timeout();
+                checkTask4Retry();
+                checkProcess4Timeout();
             } catch (Exception e) {
                 logger.error("state wheel thread check error:", e);
             }
@@ -73,85 +77,96 @@ public class StateWheelExecuteThread extends Thread {
         }
     }
 
-    public boolean addProcess(ProcessInstance processInstance) {
-        this.processInstanceCheckList.put(processInstance.getId(), 
processInstance);
-        return true;
+    public void addProcess4TimeoutCheck(ProcessInstance processInstance) {
+        this.processInstanceTimeoutCheckList.put(processInstance.getId(), 
processInstance);
     }
 
-    public boolean addTask(TaskInstance taskInstance) {
-        this.taskInstanceCheckList.put(taskInstance.getId(), taskInstance);
-        return true;
+    public void addTask4TimeoutCheck(TaskInstance taskInstance) {
+        this.taskInstanceTimeoutCheckList.put(taskInstance.getId(), 
taskInstance);
+    }
+
+    public void addTask4RetryCheck(TaskInstance taskInstance) {
+        this.taskInstanceRetryCheckList.put(taskInstance.getId(), 
taskInstance);
     }
 
-    private void checkTask() {
-        if (taskInstanceCheckList.isEmpty()) {
+    public void checkTask4Timeout() {
+        if (taskInstanceTimeoutCheckList.isEmpty()) {
             return;
         }
-
-        for (TaskInstance taskInstance : this.taskInstanceCheckList.values()) {
+        for (TaskInstance taskInstance : 
taskInstanceTimeoutCheckList.values()) {
             if (TimeoutFlag.OPEN == 
taskInstance.getTaskDefine().getTimeoutFlag()) {
                 long timeRemain = 
DateUtils.getRemainTime(taskInstance.getStartTime(), 
taskInstance.getTaskDefine().getTimeout() * Constants.SEC_2_MINUTES_TIME_UNIT);
-                if (0 >= timeRemain && processTimeout(taskInstance)) {
-                    taskInstanceCheckList.remove(taskInstance.getId());
+                if (0 >= timeRemain) {
+                    addTaskTimeoutEvent(taskInstance);
+                    taskInstanceTimeoutCheckList.remove(taskInstance.getId());
                 }
             }
+        }
+    }
+
+    private void checkTask4Retry() {
+        if (taskInstanceRetryCheckList.isEmpty()) {
+            return;
+        }
+
+        for (TaskInstance taskInstance : 
this.taskInstanceRetryCheckList.values()) {
             if (taskInstance.taskCanRetry() && 
taskInstance.retryTaskIntervalOverTime()) {
-                processDependCheck(taskInstance);
-                taskInstanceCheckList.remove(taskInstance.getId());
+                addTaskStateChangeEvent(taskInstance);
+                taskInstanceRetryCheckList.remove(taskInstance.getId());
             }
             if (taskInstance.isSubProcess() || taskInstance.isDependTask()) {
-                processDependCheck(taskInstance);
+                addTaskStateChangeEvent(taskInstance);
             }
         }
     }
 
-    private void checkProcess() {
-        if (processInstanceCheckList.isEmpty()) {
+    private void checkProcess4Timeout() {
+        if (processInstanceTimeoutCheckList.isEmpty()) {
             return;
         }
-        for (ProcessInstance processInstance : 
this.processInstanceCheckList.values()) {
+        for (ProcessInstance processInstance : 
this.processInstanceTimeoutCheckList.values()) {
 
             long timeRemain = 
DateUtils.getRemainTime(processInstance.getStartTime(), 
processInstance.getTimeout() * Constants.SEC_2_MINUTES_TIME_UNIT);
-            if (0 <= timeRemain && processTimeout(processInstance)) {
-                processInstanceCheckList.remove(processInstance.getId());
+            if (0 >= timeRemain) {
+                addProcessTimeoutEvent(processInstance);
+                
processInstanceTimeoutCheckList.remove(processInstance.getId());
             }
         }
     }
 
-    private void putEvent(StateEvent stateEvent) {
-
-        if 
(!processInstanceExecMaps.containsKey(stateEvent.getProcessInstanceId())) {
-            return;
-        }
-        WorkflowExecuteThread workflowExecuteThread = 
this.processInstanceExecMaps.get(stateEvent.getProcessInstanceId());
-        workflowExecuteThread.addStateEvent(stateEvent);
-    }
-
-    private boolean processDependCheck(TaskInstance taskInstance) {
+    private boolean addTaskStateChangeEvent(TaskInstance taskInstance) {
         StateEvent stateEvent = new StateEvent();
         stateEvent.setType(StateEventType.TASK_STATE_CHANGE);
         stateEvent.setProcessInstanceId(taskInstance.getProcessInstanceId());
         stateEvent.setTaskInstanceId(taskInstance.getId());
         stateEvent.setExecutionStatus(ExecutionStatus.RUNNING_EXECUTION);
-        putEvent(stateEvent);
+        addEvent(stateEvent);
         return true;
     }
 
-    private boolean processTimeout(TaskInstance taskInstance) {
+    private boolean addTaskTimeoutEvent(TaskInstance taskInstance) {
         StateEvent stateEvent = new StateEvent();
         stateEvent.setType(StateEventType.TASK_TIMEOUT);
         stateEvent.setProcessInstanceId(taskInstance.getProcessInstanceId());
         stateEvent.setTaskInstanceId(taskInstance.getId());
-        putEvent(stateEvent);
+        addEvent(stateEvent);
         return true;
     }
 
-    private boolean processTimeout(ProcessInstance processInstance) {
+    private boolean addProcessTimeoutEvent(ProcessInstance processInstance) {
         StateEvent stateEvent = new StateEvent();
         stateEvent.setType(StateEventType.PROCESS_TIMEOUT);
         stateEvent.setProcessInstanceId(processInstance.getId());
-        putEvent(stateEvent);
+        addEvent(stateEvent);
         return true;
     }
 
+    private void addEvent(StateEvent stateEvent) {
+        if 
(!processInstanceExecMaps.contains(stateEvent.getProcessInstanceId())) {
+            return;
+        }
+        WorkflowExecuteThread workflowExecuteThread = 
this.processInstanceExecMaps.get(stateEvent.getProcessInstanceId());
+        workflowExecuteThread.addStateEvent(stateEvent);
+    }
+
 }
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/WorkflowExecuteThread.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/WorkflowExecuteThread.java
index 1e45ec4..53c0bf4 100644
--- 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/WorkflowExecuteThread.java
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/WorkflowExecuteThread.java
@@ -17,13 +17,25 @@
 
 package org.apache.dolphinscheduler.server.master.runner;
 
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Table;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
+import static 
org.apache.dolphinscheduler.common.Constants.CMDPARAM_COMPLEMENT_DATA_END_DATE;
+import static 
org.apache.dolphinscheduler.common.Constants.CMDPARAM_COMPLEMENT_DATA_START_DATE;
+import static 
org.apache.dolphinscheduler.common.Constants.CMD_PARAM_RECOVERY_START_NODE_STRING;
+import static 
org.apache.dolphinscheduler.common.Constants.CMD_PARAM_START_NODES;
+import static 
org.apache.dolphinscheduler.common.Constants.DEFAULT_WORKER_GROUP;
+
 import org.apache.dolphinscheduler.common.Constants;
-import org.apache.dolphinscheduler.common.enums.*;
+import org.apache.dolphinscheduler.common.enums.CommandType;
+import org.apache.dolphinscheduler.common.enums.DependResult;
+import org.apache.dolphinscheduler.common.enums.Direct;
+import org.apache.dolphinscheduler.common.enums.ExecutionStatus;
+import org.apache.dolphinscheduler.common.enums.FailureStrategy;
+import org.apache.dolphinscheduler.common.enums.Flag;
+import org.apache.dolphinscheduler.common.enums.Priority;
+import org.apache.dolphinscheduler.common.enums.StateEvent;
+import org.apache.dolphinscheduler.common.enums.StateEventType;
+import org.apache.dolphinscheduler.common.enums.TaskDependType;
+import org.apache.dolphinscheduler.common.enums.TaskTimeoutStrategy;
+import org.apache.dolphinscheduler.common.enums.TimeoutFlag;
 import org.apache.dolphinscheduler.common.graph.DAG;
 import org.apache.dolphinscheduler.common.model.TaskNode;
 import org.apache.dolphinscheduler.common.model.TaskNodeRelation;
@@ -33,7 +45,13 @@ import org.apache.dolphinscheduler.common.utils.DateUtils;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
 import org.apache.dolphinscheduler.common.utils.NetUtils;
 import org.apache.dolphinscheduler.common.utils.ParameterUtils;
-import org.apache.dolphinscheduler.dao.entity.*;
+import org.apache.dolphinscheduler.dao.entity.Environment;
+import org.apache.dolphinscheduler.dao.entity.ProcessDefinition;
+import org.apache.dolphinscheduler.dao.entity.ProcessInstance;
+import org.apache.dolphinscheduler.dao.entity.ProjectUser;
+import org.apache.dolphinscheduler.dao.entity.Schedule;
+import org.apache.dolphinscheduler.dao.entity.TaskDefinition;
+import org.apache.dolphinscheduler.dao.entity.TaskInstance;
 import org.apache.dolphinscheduler.dao.utils.DagHelper;
 import org.apache.dolphinscheduler.remote.command.HostUpdateCommand;
 import org.apache.dolphinscheduler.remote.utils.Host;
@@ -46,14 +64,29 @@ import 
org.apache.dolphinscheduler.service.alert.ProcessAlertManager;
 import org.apache.dolphinscheduler.service.process.ProcessService;
 import org.apache.dolphinscheduler.service.quartz.cron.CronUtils;
 import org.apache.dolphinscheduler.service.queue.PeerTaskInstancePriorityQueue;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-import java.util.*;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
-import static org.apache.dolphinscheduler.common.Constants.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Table;
 
 /**
  * master exec thread,split dag
@@ -154,8 +187,12 @@ public class WorkflowExecuteThread implements Runnable {
     private ConcurrentHashMap<Integer, TaskInstance> taskTimeoutCheckList;
 
     /**
+     * task retry check list
+     */
+    private ConcurrentHashMap<Integer, TaskInstance> taskRetryCheckList;
+
+    /**
      * start flag, true: start nodes submit completely
-     *
      */
     private boolean isStart = false;
 
@@ -165,14 +202,14 @@ public class WorkflowExecuteThread implements Runnable {
      * @param processInstance processInstance
      * @param processService processService
      * @param nettyExecutorManager nettyExecutorManager
-     * @param taskTimeoutCheckList
      */
     public WorkflowExecuteThread(ProcessInstance processInstance
             , ProcessService processService
             , NettyExecutorManager nettyExecutorManager
             , ProcessAlertManager processAlertManager
             , MasterConfig masterConfig
-            , ConcurrentHashMap<Integer, TaskInstance> taskTimeoutCheckList) {
+            , ConcurrentHashMap<Integer, TaskInstance> taskTimeoutCheckList
+            , ConcurrentHashMap<Integer, TaskInstance> taskRetryCheckList) {
         this.processService = processService;
 
         this.processInstance = processInstance;
@@ -180,6 +217,7 @@ public class WorkflowExecuteThread implements Runnable {
         this.nettyExecutorManager = nettyExecutorManager;
         this.processAlertManager = processAlertManager;
         this.taskTimeoutCheckList = taskTimeoutCheckList;
+        this.taskRetryCheckList = taskRetryCheckList;
     }
 
     @Override
@@ -197,7 +235,6 @@ public class WorkflowExecuteThread implements Runnable {
 
     /**
      * the process start nodes are submitted completely.
-     * @return
      */
     public boolean isStart() {
         return this.isStart;
@@ -296,11 +333,10 @@ public class WorkflowExecuteThread implements Runnable {
         if (TaskTimeoutStrategy.FAILED == taskTimeoutStrategy) {
             ITaskProcessor taskProcessor = 
activeTaskProcessorMaps.get(stateEvent.getTaskInstanceId());
             taskProcessor.action(TaskAction.TIMEOUT);
-            return false;
         } else {
             processAlertManager.sendTaskTimeoutAlert(processInstance, 
taskInstance, taskInstance.getTaskDefine());
-            return true;
         }
+        return true;
     }
 
     private boolean processTimeout() {
@@ -342,6 +378,7 @@ public class WorkflowExecuteThread implements Runnable {
                         task.getMaxRetryTimes(),
                         task.getRetryInterval());
                 this.addTimeoutCheck(task);
+                this.addRetryCheck(task);
             } else {
                 submitStandByTask();
             }
@@ -351,6 +388,7 @@ public class WorkflowExecuteThread implements Runnable {
         completeTaskList.put(Long.toString(task.getTaskCode()), task);
         activeTaskProcessorMaps.remove(task.getId());
         taskTimeoutCheckList.remove(task.getId());
+        taskRetryCheckList.remove(task.getId());
         if (task.getState().typeIsSuccess()) {
             processInstance.setVarPool(task.getVarPool());
             processService.saveProcessInstance(processInstance);
@@ -497,7 +535,7 @@ public class WorkflowExecuteThread implements Runnable {
                 processInstance.getProcessDefinitionVersion());
         recoverNodeIdList = 
getStartTaskInstanceList(processInstance.getCommandParam());
         List<TaskNode> taskNodeList =
-            
processService.transformTask(processService.findRelationByCode(processDefinition.getProjectCode(),
 processDefinition.getCode()), Lists.newArrayList());
+                
processService.transformTask(processService.findRelationByCode(processDefinition.getProjectCode(),
 processDefinition.getCode()), Lists.newArrayList());
         forbiddenTaskList.clear();
 
         taskNodeList.forEach(taskNode -> {
@@ -585,6 +623,7 @@ public class WorkflowExecuteThread implements Runnable {
                 activeTaskProcessorMaps.put(taskInstance.getId(), 
taskProcessor);
                 taskProcessor.run();
                 addTimeoutCheck(taskInstance);
+                addRetryCheck(taskInstance);
                 TaskDefinition taskDefinition = 
processService.findTaskDefinition(
                         taskInstance.getTaskCode(),
                         taskInstance.getTaskDefinitionVersion());
@@ -635,15 +674,34 @@ public class WorkflowExecuteThread implements Runnable {
                 taskInstance.getTaskDefinitionVersion()
         );
         taskInstance.setTaskDefine(taskDefinition);
-        if (TimeoutFlag.OPEN == taskDefinition.getTimeoutFlag() || 
taskInstance.taskCanRetry()) {
+        if (TimeoutFlag.OPEN == taskDefinition.getTimeoutFlag()) {
+            this.taskTimeoutCheckList.put(taskInstance.getId(), taskInstance);
+        }
+        if (taskInstance.isDependTask() || taskInstance.isSubProcess()) {
             this.taskTimeoutCheckList.put(taskInstance.getId(), taskInstance);
-        } else {
-            if (taskInstance.isDependTask() || taskInstance.isSubProcess()) {
-                this.taskTimeoutCheckList.put(taskInstance.getId(), 
taskInstance);
-            }
         }
     }
 
+    private void addRetryCheck(TaskInstance taskInstance) {
+        if (taskRetryCheckList.containsKey(taskInstance.getId())) {
+            return;
+        }
+        TaskDefinition taskDefinition = taskInstance.getTaskDefine();
+        if (taskDefinition == null) {
+            logger.error("taskDefinition is null, taskId:{}", 
taskInstance.getId());
+            return;
+        }
+
+        if (taskInstance.taskCanRetry()) {
+            this.taskRetryCheckList.put(taskInstance.getId(), taskInstance);
+        }
+
+        if (taskInstance.isDependTask() || taskInstance.isSubProcess()) {
+            this.taskRetryCheckList.put(taskInstance.getId(), taskInstance);
+        }
+    }
+
+
     /**
      * find task instance in db.
      * in case submit more than one same name task in the same time.
@@ -991,7 +1049,6 @@ public class WorkflowExecuteThread implements Runnable {
     /**
      * generate the latest process instance status by the tasks state
      *
-     * @param instance
      * @return process instance execution status
      */
     private ExecutionStatus getProcessInstanceState(ProcessInstance instance) {
diff --git 
a/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/master/WorkflowExecuteThreadTest.java
 
b/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/master/WorkflowExecuteThreadTest.java
index 3bd66c6..bf527d2 100644
--- 
a/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/master/WorkflowExecuteThreadTest.java
+++ 
b/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/master/WorkflowExecuteThreadTest.java
@@ -22,8 +22,6 @@ import static 
org.apache.dolphinscheduler.common.Constants.CMDPARAM_COMPLEMENT_D
 import static 
org.apache.dolphinscheduler.common.Constants.CMD_PARAM_RECOVERY_START_NODE_STRING;
 import static 
org.apache.dolphinscheduler.common.Constants.CMD_PARAM_START_NODES;
 
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
 import static org.powermock.api.mockito.PowerMockito.mock;
 
 import org.apache.dolphinscheduler.common.enums.CommandType;
@@ -34,7 +32,6 @@ import org.apache.dolphinscheduler.common.utils.DateUtils;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
 import org.apache.dolphinscheduler.dao.entity.ProcessDefinition;
 import org.apache.dolphinscheduler.dao.entity.ProcessInstance;
-import org.apache.dolphinscheduler.dao.entity.Schedule;
 import org.apache.dolphinscheduler.dao.entity.TaskInstance;
 import org.apache.dolphinscheduler.server.master.config.MasterConfig;
 import org.apache.dolphinscheduler.server.master.runner.WorkflowExecuteThread;
@@ -47,7 +44,6 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -105,7 +101,8 @@ public class WorkflowExecuteThreadTest {
         
Mockito.when(processInstance.getProcessDefinition()).thenReturn(processDefinition);
 
         ConcurrentHashMap<Integer, TaskInstance> taskTimeoutCheckList = new 
ConcurrentHashMap<>();
-        workflowExecuteThread = PowerMockito.spy(new 
WorkflowExecuteThread(processInstance, processService, null, null, config, 
taskTimeoutCheckList));
+        ConcurrentHashMap<Integer, TaskInstance> taskRetryCheckList = new 
ConcurrentHashMap<>();
+        workflowExecuteThread = PowerMockito.spy(new 
WorkflowExecuteThread(processInstance, processService, null, null, config, 
taskTimeoutCheckList, taskRetryCheckList));
         // prepareProcess init dag
         Field dag = WorkflowExecuteThread.class.getDeclaredField("dag");
         dag.setAccessible(true);

Reply via email to