Browse Source

[Improvement][Master] Calculate the remainTime then we set the delay execution. (#15012)

* [#15007][fix][worker-server] fix bug task delay execution

* [#15007][fix][worker-server] fix bug task delay execution
    mvn spotless:apply

* [#15007][fix][worker-server] fix bug task delay execution
    worker fix  task delay logic

---------

Co-authored-by: 旺阳 <wang@lqwang.net>
dbac 1 year ago
parent
commit
d683553324

+ 16 - 12
dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/rpc/LogicITaskInstanceDispatchOperationFunction.java

@@ -62,19 +62,23 @@ public class LogicITaskInstanceDispatchOperationFunction
             LogUtils.setTaskInstanceLogFullPathMDC(taskExecutionContext.getLogPath());
 
             MasterTaskExecutionContextHolder.putTaskExecutionContext(taskExecutionContext);
-            // todo: calculate the delay in master dispatcher then we don't need to use a queue to store the task
-            final long remainTime =
-                    DateUtils.getRemainTime(DateUtils.timeStampToDate(taskExecutionContext.getFirstSubmitTime()),
-                            TimeUnit.SECONDS.toMillis(taskExecutionContext.getDelayTime()));
-            if (remainTime > 0) {
-                log.info("Current taskInstance: {} is choosing delay execution, delay time: {}/ms, remainTime: {}/ms",
-                        taskExecutionContext.getTaskName(),
-                        TimeUnit.SECONDS.toMillis(taskExecutionContext.getDelayTime()), remainTime);
-                taskExecutionContext.setCurrentExecutionStatus(TaskExecutionStatus.DELAY_EXECUTION);
-                // todo: send delay execution message
-                return LogicTaskDispatchResponse.success(taskExecutionContext.getTaskInstanceId());
-            }
 
+            int delayTime = taskExecutionContext.getDelayTime();
+            if (delayTime > 0) {
+                // todo: calculate the delay in master dispatcher then we don't need to use a queue to store the task
+                final long remainTime =
+                        DateUtils.getRemainTime(DateUtils.timeStampToDate(taskExecutionContext.getFirstSubmitTime()),
+                                TimeUnit.SECONDS.toMillis(delayTime));
+                if (remainTime > 0) {
+                    log.info(
+                            "Current taskInstance: {} is choosing delay execution, delay time: {}/ms, remainTime: {}/ms",
+                            taskExecutionContext.getTaskName(),
+                            TimeUnit.SECONDS.toMillis(taskExecutionContext.getDelayTime()), remainTime);
+                    taskExecutionContext.setCurrentExecutionStatus(TaskExecutionStatus.DELAY_EXECUTION);
+                    // todo: send delay execution message
+                    return LogicTaskDispatchResponse.success(taskExecutionContext.getTaskInstanceId());
+                }
+            }
             final MasterDelayTaskExecuteRunnable masterDelayTaskExecuteRunnable =
                     masterTaskExecuteRunnableFactoryBuilder
                             .createWorkerDelayTaskExecuteRunnableFactory(taskExecutionContext.getTaskType())

+ 15 - 10
dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/runner/GlobalTaskInstanceDispatchQueueLooper.java

@@ -75,16 +75,21 @@ public class GlobalTaskInstanceDispatchQueueLooper extends BaseDaemonThread {
                 TaskExecutionContext taskExecutionContext = globalTaskInstanceDispatchQueue.take();
                 LogUtils.setTaskInstanceLogFullPathMDC(taskExecutionContext.getLogPath());
                 LogUtils.setTaskInstanceIdMDC(taskExecutionContext.getTaskInstanceId());
-                // delay task process
-                long remainTime =
-                        DateUtils.getRemainTime(DateUtils.timeStampToDate(taskExecutionContext.getFirstSubmitTime()),
-                                taskExecutionContext.getDelayTime() * 60L);
-                if (remainTime > 0) {
-                    log.info("Current taskInstance is choose delay execution, delay time: {}s", remainTime);
-                    taskExecutionContext.setCurrentExecutionStatus(TaskExecutionStatus.DELAY_EXECUTION);
-                    // todo: use delay running event
-                    workerMessageSender.sendMessage(taskExecutionContext,
-                            ITaskInstanceExecutionEvent.TaskInstanceExecutionEventType.FINISH);
+
+                int delayTime = taskExecutionContext.getDelayTime();
+                if (delayTime > 0) {
+                    // delay task process
+                    long remainTime =
+                            DateUtils.getRemainTime(
+                                    DateUtils.timeStampToDate(taskExecutionContext.getFirstSubmitTime()),
+                                    delayTime * 60L);
+                    if (remainTime > 0) {
+                        log.info("Current taskInstance is choose delay execution, delay time: {}s", remainTime);
+                        taskExecutionContext.setCurrentExecutionStatus(TaskExecutionStatus.DELAY_EXECUTION);
+                        // todo: use delay running event
+                        workerMessageSender.sendMessage(taskExecutionContext,
+                                ITaskInstanceExecutionEvent.TaskInstanceExecutionEventType.FINISH);
+                    }
                 }
                 WorkerDelayTaskExecuteRunnable workerTaskExecuteRunnable = WorkerTaskExecuteRunnableFactoryBuilder
                         .createWorkerDelayTaskExecuteRunnableFactory(