From c0df06a2f13b08b19805f526bebb653e76ff6880 Mon Sep 17 00:00:00 2001 From: guowl3 Date: Thu, 23 Jan 2025 15:02:53 +0800 Subject: [PATCH] fix(changelog): the status does not progress to 'Failed' when a change error occurs (#4196) * catch exception when change schedule failed and update changelog status to failed * throw e --- .../odc/service/quartz/QuartzJobService.java | 8 +- .../odc/service/schedule/ScheduleService.java | 112 +++++++++--------- 2 files changed, 65 insertions(+), 55 deletions(-) diff --git a/server/odc-service/src/main/java/com/oceanbase/odc/service/quartz/QuartzJobService.java b/server/odc-service/src/main/java/com/oceanbase/odc/service/quartz/QuartzJobService.java index 433a3e6d0d..0832fd5056 100644 --- a/server/odc-service/src/main/java/com/oceanbase/odc/service/quartz/QuartzJobService.java +++ b/server/odc-service/src/main/java/com/oceanbase/odc/service/quartz/QuartzJobService.java @@ -47,12 +47,14 @@ import com.oceanbase.odc.service.schedule.model.QuartzKeyGenerator; import com.oceanbase.odc.service.schedule.model.TriggerConfig; +import lombok.extern.slf4j.Slf4j; + /** * @Author:tinker * @Date: 2022/11/14 18:28 * @Descripition: */ - +@Slf4j @Service @SkipAuthorize("odc internal usage") public class QuartzJobService { @@ -102,7 +104,9 @@ public void changeQuartzJob(ChangeQuartJobParam req) { throw new UnsupportedException(); } } catch (Exception e) { - throw new UnexpectedException(""); + log.warn("Failed to change quartz job,jobName={},jobGroup={},operationType={}", req.getJobName(), + req.getJobGroup(), req.getOperationType(), e); + throw new UnexpectedException("Failed to change quartz job."); } } diff --git a/server/odc-service/src/main/java/com/oceanbase/odc/service/schedule/ScheduleService.java b/server/odc-service/src/main/java/com/oceanbase/odc/service/schedule/ScheduleService.java index 0d22ee6c65..84db4be8d2 100644 --- a/server/odc-service/src/main/java/com/oceanbase/odc/service/schedule/ScheduleService.java +++ b/server/odc-service/src/main/java/com/oceanbase/odc/service/schedule/ScheduleService.java @@ -433,63 +433,69 @@ private void validateTriggerConfig(TriggerConfig triggerConfig) { @Transactional(rollbackFor = Exception.class) public void executeChangeSchedule(ScheduleChangeParams req) { - Schedule targetSchedule = nullSafeGetModelById(req.getScheduleId()); - // start to change schedule - switch (req.getOperationType()) { - case CREATE: - case RESUME: { - scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.ENABLED); - break; - } - case UPDATE: { - ScheduleEntity entity = nullSafeGetById(req.getScheduleId()); - entity.setJobParametersJson(JsonUtils.toJson(req.getUpdateScheduleReq().getParameters())); - entity.setTriggerConfigJson(JsonUtils.toJson(req.getUpdateScheduleReq().getTriggerConfig())); - entity.setDescription(req.getUpdateScheduleReq().getDescription()); - entity.setStatus(ScheduleStatus.ENABLED); - PreConditions.notNull(req.getUpdateScheduleReq(), "req.updateScheduleReq"); - if (req.getUpdateScheduleReq().getParameters() instanceof DataArchiveParameters) { - DataArchiveParameters parameters = (DataArchiveParameters) req.getUpdateScheduleReq() - .getParameters(); - parameters.getRateLimit().setOrderId(req.getScheduleId()); - dlmLimiterService.updateByOrderId(req.getScheduleId(), parameters.getRateLimit()); + try { + Schedule targetSchedule = nullSafeGetModelById(req.getScheduleId()); + // start to change schedule + switch (req.getOperationType()) { + case CREATE: + case RESUME: { + scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.ENABLED); + break; } - if (req.getUpdateScheduleReq().getParameters() instanceof DataDeleteParameters) { - DataDeleteParameters parameters = (DataDeleteParameters) req.getUpdateScheduleReq() - .getParameters(); - parameters.getRateLimit().setOrderId(req.getScheduleId()); - dlmLimiterService.updateByOrderId(req.getScheduleId(), parameters.getRateLimit()); + case UPDATE: { + ScheduleEntity entity = nullSafeGetById(req.getScheduleId()); + entity.setJobParametersJson(JsonUtils.toJson(req.getUpdateScheduleReq().getParameters())); + entity.setTriggerConfigJson(JsonUtils.toJson(req.getUpdateScheduleReq().getTriggerConfig())); + entity.setDescription(req.getUpdateScheduleReq().getDescription()); + entity.setStatus(ScheduleStatus.ENABLED); + PreConditions.notNull(req.getUpdateScheduleReq(), "req.updateScheduleReq"); + if (req.getUpdateScheduleReq().getParameters() instanceof DataArchiveParameters) { + DataArchiveParameters parameters = (DataArchiveParameters) req.getUpdateScheduleReq() + .getParameters(); + parameters.getRateLimit().setOrderId(req.getScheduleId()); + dlmLimiterService.updateByOrderId(req.getScheduleId(), parameters.getRateLimit()); + } + if (req.getUpdateScheduleReq().getParameters() instanceof DataDeleteParameters) { + DataDeleteParameters parameters = (DataDeleteParameters) req.getUpdateScheduleReq() + .getParameters(); + parameters.getRateLimit().setOrderId(req.getScheduleId()); + dlmLimiterService.updateByOrderId(req.getScheduleId(), parameters.getRateLimit()); + } + targetSchedule = scheduleMapper.entityToModel(scheduleRepository.save(entity)); + break; } - targetSchedule = scheduleMapper.entityToModel(scheduleRepository.save(entity)); - break; - } - case PAUSE: { - scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.PAUSE); - break; - } - case TERMINATE: { - scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.TERMINATED); - break; - } - case DELETE: { - scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.DELETED); - break; + case PAUSE: { + scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.PAUSE); + break; + } + case TERMINATE: { + scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.TERMINATED); + break; + } + case DELETE: { + scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.DELETED); + break; + } + default: + throw new UnsupportedException(); } - default: - throw new UnsupportedException(); - } - // start change quartzJob - ChangeQuartJobParam quartzJobReq = new ChangeQuartJobParam(); - quartzJobReq.setOperationType(req.getOperationType()); - quartzJobReq.setJobName(targetSchedule.getId().toString()); - quartzJobReq.setJobGroup(targetSchedule.getType().name()); - quartzJobReq.setTriggerConfig(targetSchedule.getTriggerConfig()); - quartzJobService.changeQuartzJob(quartzJobReq); - - scheduleChangeLogService.updateStatusById(req.getScheduleChangeLogId(), ScheduleChangeStatus.SUCCESS); - log.info("Change schedule success,scheduleId={},operationType={},changelogId={}", targetSchedule.getId(), - req.getOperationType(), req.getScheduleChangeLogId()); + // start change quartzJob + ChangeQuartJobParam quartzJobReq = new ChangeQuartJobParam(); + quartzJobReq.setOperationType(req.getOperationType()); + quartzJobReq.setJobName(targetSchedule.getId().toString()); + quartzJobReq.setJobGroup(targetSchedule.getType().name()); + quartzJobReq.setTriggerConfig(targetSchedule.getTriggerConfig()); + quartzJobService.changeQuartzJob(quartzJobReq); + scheduleChangeLogService.updateStatusById(req.getScheduleChangeLogId(), ScheduleChangeStatus.SUCCESS); + log.info("Change schedule success,scheduleId={},operationType={},changelogId={}", targetSchedule.getId(), + req.getOperationType(), req.getScheduleChangeLogId()); + } catch (Exception e) { + log.warn("Change schedule failed,scheduleId={},operationType={},changelogId={}", req.getScheduleId(), + req.getOperationType(), req.getScheduleChangeLogId(), e); + scheduleChangeLogService.updateStatusById(req.getScheduleChangeLogId(), ScheduleChangeStatus.FAILED); + throw e; + } }