From bc957153c60fe8b169b072007af42aee948e169b Mon Sep 17 00:00:00 2001 From: Aaron Wang Date: Wed, 28 Dec 2022 14:51:59 +0800 Subject: [PATCH] [Bug] [Server] Once click online schedule time, task will be automatically scheduled (#13092) * fix bug that trigger mis-fire strategy when setting start time earlier than current time * update ut * add warning msg * add check start time when set schedule online (cherry picked from commit 7497b26979ec1ba5c473c99d8e51a97c91250f25) --- .../dolphinscheduler/api/enums/Status.java | 1 + .../service/impl/SchedulerServiceImpl.java | 21 +++++++++++++++++-- .../api/service/SchedulerServiceTest.java | 15 +++++++++++++ .../definition/components/use-form.ts | 2 +- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java index 2730c8512047..652625593b02 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java @@ -330,6 +330,7 @@ public enum Status { COMMAND_STATE_COUNT_ERROR(80001, "task instance state count error", "查询各状态任务实例数错误"), NEGTIVE_SIZE_NUMBER_ERROR(80002, "query size number error", "查询size错误"), START_TIME_BIGGER_THAN_END_TIME_ERROR(80003, "start time bigger than end time error", "开始时间在结束时间之后错误"), + START_TIME_BEFORE_CURRENT_TIME_ERROR(80004, "start time before current time error", "开始时间在当前时间之前错误"), QUEUE_COUNT_ERROR(90001, "queue count error", "查询队列数据错误"), KERBEROS_STARTUP_STATE(100001, "get kerberos startup state error", "获取kerberos启动状态错误"), diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java index bd481bc2c5c9..103d1cd720b0 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java @@ -166,13 +166,18 @@ public Map insertSchedule(User loginUser, scheduleObj.setProcessDefinitionName(processDefinition.getName()); ScheduleParam scheduleParam = JSONUtils.parseObject(schedule, ScheduleParam.class); + if (now.after(scheduleParam.getStartTime())) { + logger.warn("The start time must be later than current time."); + putMsg(result, Status.START_TIME_BEFORE_CURRENT_TIME_ERROR); + return result; + } if (DateUtils.differSec(scheduleParam.getStartTime(), scheduleParam.getEndTime()) == 0) { logger.warn("The start time must not be the same as the end"); putMsg(result, Status.SCHEDULE_START_TIME_END_TIME_SAME); return result; } if (scheduleParam.getStartTime().getTime() > scheduleParam.getEndTime().getTime()) { - logger.warn("The start time must smaller than end time"); + logger.warn("The start time must be smaller than end time."); putMsg(result, Status.START_TIME_BIGGER_THAN_END_TIME_ERROR); return result; } @@ -319,6 +324,13 @@ public Map setScheduleState(User loginUser, return result; } if (scheduleStatus == ReleaseState.ONLINE) { + // check schedule start time + Date now = new Date(); + if (now.after(scheduleObj.getStartTime())) { + logger.warn("The start time must be later than current time."); + putMsg(result, Status.START_TIME_BEFORE_CURRENT_TIME_ERROR); + return result; + } // check process definition release state if (processDefinition.getReleaseState() != ReleaseState.ONLINE) { logger.info("not release process definition id: {} , name : {}", @@ -667,13 +679,18 @@ private void updateSchedule(Map result, putMsg(result, Status.PARSE_TO_CRON_EXPRESSION_ERROR); return; } + if (now.after(scheduleParam.getStartTime())) { + logger.warn("The start time must be later than current time."); + putMsg(result, Status.START_TIME_BEFORE_CURRENT_TIME_ERROR); + return; + } if (DateUtils.differSec(scheduleParam.getStartTime(), scheduleParam.getEndTime()) == 0) { logger.warn("The start time must not be the same as the end"); putMsg(result, Status.SCHEDULE_START_TIME_END_TIME_SAME); return; } if (scheduleParam.getStartTime().getTime() > scheduleParam.getEndTime().getTime()) { - logger.warn("The start time must smaller than end time"); + logger.warn("The start time must be smaller than end time."); putMsg(result, Status.START_TIME_BIGGER_THAN_END_TIME_ERROR); return; } diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java index 6ac83e795d37..1578673f322f 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java @@ -83,6 +83,21 @@ public class SchedulerServiceTest { @InjectMocks private QuartzExecutorImpl quartzExecutors; + protected static User user; + protected Exception exception; + private static final String userName = "userName"; + private static final String projectName = "projectName"; + private static final long projectCode = 1L; + private static final int userId = 1; + private static final String processDefinitionName = "processDefinitionName"; + private static final long processDefinitionCode = 2L; + private static final int processDefinitionVersion = 3; + private static final int scheduleId = 3; + private static final long environmentCode = 4L; + private static final String startTime = "2220-01-01 12:13:14"; + private static final String endTime = "2220-02-01 12:13:14"; + private static final String crontab = "0 0 * * * ? *"; + @Before public void setUp() { diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/components/use-form.ts b/dolphinscheduler-ui/src/views/projects/workflow/definition/components/use-form.ts index 186d0d9532e1..2e3dd46e1e18 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/components/use-form.ts +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/components/use-form.ts @@ -74,7 +74,7 @@ export const useForm = () => { timingFormRef: ref(), timingForm: { startEndTime: [ - new Date(year, month, day), + new Date(year, month, day + 1), new Date(year + 100, month, day) ], crontab: '0 0 * * * ? *',