Skip to content

Commit

Permalink
fix(changelog): the status does not progress to 'Failed' when a chang…
Browse files Browse the repository at this point in the history
…e error occurs (#4196)

* catch exception when change schedule failed and update changelog status to failed

* throw e
  • Loading branch information
guowl3 authored Jan 23, 2025
1 parent e5caabd commit c0df06a
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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.");
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

}

Expand Down

0 comments on commit c0df06a

Please sign in to comment.