Skip to content

Commit ef2f090

Browse files
authored
fix(changelog): cannot rollback update changelog status (#4198)
* revert commit and catch exception in alterScheduleTask * rsp comments
1 parent 3b1b109 commit ef2f090

File tree

1 file changed

+67
-58
lines changed

1 file changed

+67
-58
lines changed

server/odc-service/src/main/java/com/oceanbase/odc/service/schedule/ScheduleService.java

Lines changed: 67 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import org.springframework.integration.jdbc.lock.JdbcLockRegistry;
5252
import org.springframework.stereotype.Service;
5353
import org.springframework.transaction.annotation.Transactional;
54+
import org.springframework.transaction.support.TransactionTemplate;
5455
import org.springframework.util.CollectionUtils;
5556

5657
import com.alibaba.fastjson.JSONObject;
@@ -226,6 +227,8 @@ public class ScheduleService {
226227

227228
@Autowired
228229
private ScheduleDescriptionGenerator descriptionGenerator;
230+
@Autowired
231+
private TransactionTemplate txTemplate;
229232

230233
private final ScheduleMapper scheduleMapper = ScheduleMapper.INSTANCE;
231234

@@ -431,71 +434,77 @@ private void validateTriggerConfig(TriggerConfig triggerConfig) {
431434
}
432435
}
433436

434-
@Transactional(rollbackFor = Exception.class)
435437
public void executeChangeSchedule(ScheduleChangeParams req) {
436-
try {
438+
// start change quartzJob
439+
boolean isSuccess = Boolean.TRUE.equals(txTemplate.execute(status -> {
437440
Schedule targetSchedule = nullSafeGetModelById(req.getScheduleId());
438-
// start to change schedule
439-
switch (req.getOperationType()) {
440-
case CREATE:
441-
case RESUME: {
442-
scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.ENABLED);
443-
break;
444-
}
445-
case UPDATE: {
446-
ScheduleEntity entity = nullSafeGetById(req.getScheduleId());
447-
entity.setJobParametersJson(JsonUtils.toJson(req.getUpdateScheduleReq().getParameters()));
448-
entity.setTriggerConfigJson(JsonUtils.toJson(req.getUpdateScheduleReq().getTriggerConfig()));
449-
entity.setDescription(req.getUpdateScheduleReq().getDescription());
450-
entity.setStatus(ScheduleStatus.ENABLED);
451-
PreConditions.notNull(req.getUpdateScheduleReq(), "req.updateScheduleReq");
452-
if (req.getUpdateScheduleReq().getParameters() instanceof DataArchiveParameters) {
453-
DataArchiveParameters parameters = (DataArchiveParameters) req.getUpdateScheduleReq()
454-
.getParameters();
455-
parameters.getRateLimit().setOrderId(req.getScheduleId());
456-
dlmLimiterService.updateByOrderId(req.getScheduleId(), parameters.getRateLimit());
441+
try {
442+
// start to change schedule
443+
switch (req.getOperationType()) {
444+
case CREATE:
445+
case RESUME: {
446+
scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.ENABLED);
447+
break;
457448
}
458-
if (req.getUpdateScheduleReq().getParameters() instanceof DataDeleteParameters) {
459-
DataDeleteParameters parameters = (DataDeleteParameters) req.getUpdateScheduleReq()
460-
.getParameters();
461-
parameters.getRateLimit().setOrderId(req.getScheduleId());
462-
dlmLimiterService.updateByOrderId(req.getScheduleId(), parameters.getRateLimit());
449+
case UPDATE: {
450+
ScheduleEntity entity = nullSafeGetById(req.getScheduleId());
451+
entity.setJobParametersJson(JsonUtils.toJson(req.getUpdateScheduleReq().getParameters()));
452+
entity.setTriggerConfigJson(JsonUtils.toJson(req.getUpdateScheduleReq().getTriggerConfig()));
453+
entity.setDescription(req.getUpdateScheduleReq().getDescription());
454+
entity.setStatus(ScheduleStatus.ENABLED);
455+
PreConditions.notNull(req.getUpdateScheduleReq(), "req.updateScheduleReq");
456+
if (req.getUpdateScheduleReq().getParameters() instanceof DataArchiveParameters) {
457+
DataArchiveParameters parameters = (DataArchiveParameters) req.getUpdateScheduleReq()
458+
.getParameters();
459+
parameters.getRateLimit().setOrderId(req.getScheduleId());
460+
dlmLimiterService.updateByOrderId(req.getScheduleId(), parameters.getRateLimit());
461+
}
462+
if (req.getUpdateScheduleReq().getParameters() instanceof DataDeleteParameters) {
463+
DataDeleteParameters parameters = (DataDeleteParameters) req.getUpdateScheduleReq()
464+
.getParameters();
465+
parameters.getRateLimit().setOrderId(req.getScheduleId());
466+
dlmLimiterService.updateByOrderId(req.getScheduleId(), parameters.getRateLimit());
467+
}
468+
targetSchedule = scheduleMapper.entityToModel(scheduleRepository.save(entity));
469+
break;
463470
}
464-
targetSchedule = scheduleMapper.entityToModel(scheduleRepository.save(entity));
465-
break;
466-
}
467-
case PAUSE: {
468-
scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.PAUSE);
469-
break;
470-
}
471-
case TERMINATE: {
472-
scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.TERMINATED);
473-
break;
474-
}
475-
case DELETE: {
476-
scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.DELETED);
477-
break;
471+
case PAUSE: {
472+
scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.PAUSE);
473+
break;
474+
}
475+
case TERMINATE: {
476+
scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.TERMINATED);
477+
break;
478+
}
479+
case DELETE: {
480+
scheduleRepository.updateStatusById(targetSchedule.getId(), ScheduleStatus.DELETED);
481+
break;
482+
}
483+
default:
484+
throw new UnsupportedException();
478485
}
479-
default:
480-
throw new UnsupportedException();
486+
487+
// start change quartzJob
488+
ChangeQuartJobParam quartzJobReq = new ChangeQuartJobParam();
489+
quartzJobReq.setOperationType(req.getOperationType());
490+
quartzJobReq.setJobName(targetSchedule.getId().toString());
491+
quartzJobReq.setJobGroup(targetSchedule.getType().name());
492+
quartzJobReq.setTriggerConfig(targetSchedule.getTriggerConfig());
493+
quartzJobService.changeQuartzJob(quartzJobReq);
494+
return true;
495+
} catch (Exception e) {
496+
log.warn("Change schedule failed,scheduleId={},operationType={},changelogId={}", targetSchedule.getId(),
497+
req.getOperationType(), req.getScheduleChangeLogId(), e);
498+
status.setRollbackOnly();
499+
return false;
481500
}
501+
}));
482502

483-
// start change quartzJob
484-
ChangeQuartJobParam quartzJobReq = new ChangeQuartJobParam();
485-
quartzJobReq.setOperationType(req.getOperationType());
486-
quartzJobReq.setJobName(targetSchedule.getId().toString());
487-
quartzJobReq.setJobGroup(targetSchedule.getType().name());
488-
quartzJobReq.setTriggerConfig(targetSchedule.getTriggerConfig());
489-
quartzJobService.changeQuartzJob(quartzJobReq);
490-
scheduleChangeLogService.updateStatusById(req.getScheduleChangeLogId(), ScheduleChangeStatus.SUCCESS);
491-
log.info("Change schedule success,scheduleId={},operationType={},changelogId={}", targetSchedule.getId(),
492-
req.getOperationType(), req.getScheduleChangeLogId());
493-
} catch (Exception e) {
494-
log.warn("Change schedule failed,scheduleId={},operationType={},changelogId={}", req.getScheduleId(),
495-
req.getOperationType(), req.getScheduleChangeLogId(), e);
496-
scheduleChangeLogService.updateStatusById(req.getScheduleChangeLogId(), ScheduleChangeStatus.FAILED);
497-
throw e;
498-
}
503+
scheduleChangeLogService.updateStatusById(req.getScheduleChangeLogId(),
504+
isSuccess ? ScheduleChangeStatus.SUCCESS : ScheduleChangeStatus.FAILED);
505+
log.info("Change schedule completed,scheduleId={},operationType={},changelogId={},status={}",
506+
req.getScheduleId(),
507+
req.getOperationType(), req.getScheduleChangeLogId(), isSuccess ? "SUCCESS" : "FAILED");
499508

500509
}
501510

0 commit comments

Comments
 (0)