Browse Source

[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
3.2.0-release
Aaron Wang 2 years ago committed by GitHub
parent
commit
7497b26979
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
  2. 25
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java
  3. 38
      dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java
  4. 2
      dolphinscheduler-ui/src/views/projects/workflow/definition/components/use-form.ts

1
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java

@ -408,6 +408,7 @@ public enum Status {
COMMAND_STATE_COUNT_ERROR(80001, "task instance state count error", "查询各状态任务实例数错误"), COMMAND_STATE_COUNT_ERROR(80001, "task instance state count error", "查询各状态任务实例数错误"),
NEGTIVE_SIZE_NUMBER_ERROR(80002, "query size number error", "查询size错误"), 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_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", "查询队列数据错误"), QUEUE_COUNT_ERROR(90001, "queue count error", "查询队列数据错误"),
KERBEROS_STARTUP_STATE(100001, "get kerberos startup state error", "获取kerberos启动状态错误"), KERBEROS_STARTUP_STATE(100001, "get kerberos startup state error", "获取kerberos启动状态错误"),

25
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java

@ -171,13 +171,18 @@ public class SchedulerServiceImpl extends BaseServiceImpl implements SchedulerSe
scheduleObj.setProcessDefinitionName(processDefinition.getName()); scheduleObj.setProcessDefinitionName(processDefinition.getName());
ScheduleParam scheduleParam = JSONUtils.parseObject(schedule, ScheduleParam.class); 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) { if (DateUtils.differSec(scheduleParam.getStartTime(), scheduleParam.getEndTime()) == 0) {
logger.warn("The start time must not be the same as the end or time can not be null."); logger.warn("The start time must not be the same as the end or time can not be null.");
putMsg(result, Status.SCHEDULE_START_TIME_END_TIME_SAME); putMsg(result, Status.SCHEDULE_START_TIME_END_TIME_SAME);
return result; return result;
} }
if (scheduleParam.getStartTime().getTime() > scheduleParam.getEndTime().getTime()) { 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); putMsg(result, Status.START_TIME_BIGGER_THAN_END_TIME_ERROR);
return result; return result;
} }
@ -234,6 +239,10 @@ public class SchedulerServiceImpl extends BaseServiceImpl implements SchedulerSe
if (scheduleParam == null) { if (scheduleParam == null) {
throw new ServiceException(Status.PARSE_SCHEDULE_PARAM_ERROR, scheduleParamStr); throw new ServiceException(Status.PARSE_SCHEDULE_PARAM_ERROR, scheduleParamStr);
} }
Date now = new Date();
if (now.after(scheduleParam.getStartTime())) {
throw new ServiceException(Status.START_TIME_BEFORE_CURRENT_TIME_ERROR);
}
if (DateUtils.differSec(scheduleParam.getStartTime(), scheduleParam.getEndTime()) == 0) { if (DateUtils.differSec(scheduleParam.getStartTime(), scheduleParam.getEndTime()) == 0) {
throw new ServiceException(Status.SCHEDULE_START_TIME_END_TIME_SAME); throw new ServiceException(Status.SCHEDULE_START_TIME_END_TIME_SAME);
} }
@ -471,6 +480,13 @@ public class SchedulerServiceImpl extends BaseServiceImpl implements SchedulerSe
return result; return result;
} }
if (scheduleStatus == ReleaseState.ONLINE) { 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 // check process definition release state
if (processDefinition.getReleaseState() != ReleaseState.ONLINE) { if (processDefinition.getReleaseState() != ReleaseState.ONLINE) {
logger.warn("Only process definition state is {} can change schedule state, processDefinitionCode:{}.", logger.warn("Only process definition state is {} can change schedule state, processDefinitionCode:{}.",
@ -833,13 +849,18 @@ public class SchedulerServiceImpl extends BaseServiceImpl implements SchedulerSe
putMsg(result, Status.PARSE_TO_CRON_EXPRESSION_ERROR); putMsg(result, Status.PARSE_TO_CRON_EXPRESSION_ERROR);
return; 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) { if (DateUtils.differSec(scheduleParam.getStartTime(), scheduleParam.getEndTime()) == 0) {
logger.warn("The start time must not be the same as the end or time can not be null."); logger.warn("The start time must not be the same as the end or time can not be null.");
putMsg(result, Status.SCHEDULE_START_TIME_END_TIME_SAME); putMsg(result, Status.SCHEDULE_START_TIME_END_TIME_SAME);
return; return;
} }
if (scheduleParam.getStartTime().getTime() > scheduleParam.getEndTime().getTime()) { 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); putMsg(result, Status.START_TIME_BIGGER_THAN_END_TIME_ERROR);
return; return;
} }

38
dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java

@ -105,8 +105,8 @@ public class SchedulerServiceTest extends BaseServiceTestTool {
private static final int processDefinitionVersion = 3; private static final int processDefinitionVersion = 3;
private static final int scheduleId = 3; private static final int scheduleId = 3;
private static final long environmentCode = 4L; private static final long environmentCode = 4L;
private static final String startTime = "2020-01-01 12:13:14"; private static final String startTime = "2220-01-01 12:13:14";
private static final String endTime = "2020-02-01 12:13:14"; private static final String endTime = "2220-02-01 12:13:14";
private static final String crontab = "0 0 * * * ? *"; private static final String crontab = "0 0 * * * ? *";
@BeforeEach @BeforeEach
@ -175,6 +175,8 @@ public class SchedulerServiceTest extends BaseServiceTestTool {
ScheduleCreateRequest scheduleCreateRequest = new ScheduleCreateRequest(); ScheduleCreateRequest scheduleCreateRequest = new ScheduleCreateRequest();
scheduleCreateRequest.setProcessDefinitionCode(processDefinitionCode); scheduleCreateRequest.setProcessDefinitionCode(processDefinitionCode);
scheduleCreateRequest.setEnvironmentCode(environmentCode); scheduleCreateRequest.setEnvironmentCode(environmentCode);
scheduleCreateRequest.setStartTime(startTime);
scheduleCreateRequest.setEndTime(endTime);
// error process definition not exists // error process definition not exists
exception = Assertions.assertThrows(ServiceException.class, exception = Assertions.assertThrows(ServiceException.class,
@ -208,16 +210,24 @@ public class SchedulerServiceTest extends BaseServiceTestTool {
Assertions.assertEquals(Status.QUERY_ENVIRONMENT_BY_CODE_ERROR.getCode(), Assertions.assertEquals(Status.QUERY_ENVIRONMENT_BY_CODE_ERROR.getCode(),
((ServiceException) exception).getCode()); ((ServiceException) exception).getCode());
// error schedule parameter same start time and end time // error schedule parameter start time before current time
String badStartTime = "2020-01-01 12:13:14";
scheduleCreateRequest.setStartTime(badStartTime);
Mockito.when(environmentMapper.queryByEnvironmentCode(environmentCode)).thenReturn(this.getEnvironment()); Mockito.when(environmentMapper.queryByEnvironmentCode(environmentCode)).thenReturn(this.getEnvironment());
exception = Assertions.assertThrows(ServiceException.class,
() -> schedulerService.createSchedulesV2(user, scheduleCreateRequest));
Assertions.assertEquals(Status.START_TIME_BEFORE_CURRENT_TIME_ERROR.getCode(),
((ServiceException) exception).getCode());
// error schedule parameter same start time and end time
scheduleCreateRequest.setStartTime(endTime);
exception = Assertions.assertThrows(ServiceException.class, exception = Assertions.assertThrows(ServiceException.class,
() -> schedulerService.createSchedulesV2(user, scheduleCreateRequest)); () -> schedulerService.createSchedulesV2(user, scheduleCreateRequest));
Assertions.assertEquals(Status.SCHEDULE_START_TIME_END_TIME_SAME.getCode(), Assertions.assertEquals(Status.SCHEDULE_START_TIME_END_TIME_SAME.getCode(),
((ServiceException) exception).getCode()); ((ServiceException) exception).getCode());
// error schedule parameter same start time after than end time // error schedule parameter start time after than end time
scheduleCreateRequest.setEndTime(endTime); badStartTime = "2222-01-01 12:13:14";
String badStartTime = "2022-01-01 12:13:14";
scheduleCreateRequest.setStartTime(badStartTime); scheduleCreateRequest.setStartTime(badStartTime);
exception = Assertions.assertThrows(ServiceException.class, exception = Assertions.assertThrows(ServiceException.class,
() -> schedulerService.createSchedulesV2(user, scheduleCreateRequest)); () -> schedulerService.createSchedulesV2(user, scheduleCreateRequest));
@ -361,17 +371,25 @@ public class SchedulerServiceTest extends BaseServiceTestTool {
() -> schedulerService.updateSchedulesV2(user, scheduleId, scheduleUpdateRequest)); () -> schedulerService.updateSchedulesV2(user, scheduleId, scheduleUpdateRequest));
Assertions.assertEquals(Status.SCHEDULE_NOT_EXISTS.getCode(), ((ServiceException) exception).getCode()); Assertions.assertEquals(Status.SCHEDULE_NOT_EXISTS.getCode(), ((ServiceException) exception).getCode());
// error schedule parameter same start time and end time // error schedule parameter start time before current time
String badStartTime = "2020-01-01 12:13:14";
scheduleUpdateRequest.setStartTime(badStartTime);
scheduleUpdateRequest.setEndTime(endTime); scheduleUpdateRequest.setEndTime(endTime);
scheduleUpdateRequest.setStartTime(endTime);
Mockito.when(scheduleMapper.selectById(scheduleId)).thenReturn(this.getSchedule()); Mockito.when(scheduleMapper.selectById(scheduleId)).thenReturn(this.getSchedule());
exception = Assertions.assertThrows(ServiceException.class,
() -> schedulerService.updateSchedulesV2(user, scheduleId, scheduleUpdateRequest));
Assertions.assertEquals(Status.START_TIME_BEFORE_CURRENT_TIME_ERROR.getCode(),
((ServiceException) exception).getCode());
// error schedule parameter same start time and end time
scheduleUpdateRequest.setStartTime(endTime);
exception = Assertions.assertThrows(ServiceException.class, exception = Assertions.assertThrows(ServiceException.class,
() -> schedulerService.updateSchedulesV2(user, scheduleId, scheduleUpdateRequest)); () -> schedulerService.updateSchedulesV2(user, scheduleId, scheduleUpdateRequest));
Assertions.assertEquals(Status.SCHEDULE_START_TIME_END_TIME_SAME.getCode(), Assertions.assertEquals(Status.SCHEDULE_START_TIME_END_TIME_SAME.getCode(),
((ServiceException) exception).getCode()); ((ServiceException) exception).getCode());
// error schedule parameter same start time after than end time // error schedule parameter start time after than end time
String badStartTime = "2022-01-01 12:13:14"; badStartTime = "2222-01-01 12:13:14";
scheduleUpdateRequest.setStartTime(badStartTime); scheduleUpdateRequest.setStartTime(badStartTime);
exception = Assertions.assertThrows(ServiceException.class, exception = Assertions.assertThrows(ServiceException.class,
() -> schedulerService.updateSchedulesV2(user, scheduleId, scheduleUpdateRequest)); () -> schedulerService.updateSchedulesV2(user, scheduleId, scheduleUpdateRequest));

2
dolphinscheduler-ui/src/views/projects/workflow/definition/components/use-form.ts

@ -95,7 +95,7 @@ export const useForm = () => {
timingFormRef: ref(), timingFormRef: ref(),
timingForm: { timingForm: {
startEndTime: [ startEndTime: [
new Date(year, month, day), new Date(year, month, day + 1),
new Date(year + 100, month, day) new Date(year + 100, month, day)
], ],
crontab: '0 0 * * * ? *', crontab: '0 0 * * * ? *',

Loading…
Cancel
Save