| | |
| | | Date now = new Date(); |
| | | AiAutoTuneJob rollbackJob = createRollbackJob(reason, now); |
| | | |
| | | String lockKey = RedisKeyType.AI_AUTO_TUNE_APPLY_LOCK.key; |
| | | String lockToken = UUID.randomUUID().toString(); |
| | | if (!redisUtil.trySetStringIfAbsent(lockKey, lockToken, APPLY_LOCK_SECONDS)) { |
| | | return rejectRollbackForUnavailableLock(reason, now, lockKey); |
| | | } |
| | | |
| | | try { |
| | | List<AiAutoTuneChange> sourceChanges = findLatestSuccessfulChanges(); |
| | | if (sourceChanges.isEmpty()) { |
| | | persistNoRollbackSourceJobInTransaction(rollbackJob, now); |
| | | return buildResult(rollbackJob, new ArrayList<>(), false); |
| | | } |
| | | |
| | | String lockKey = RedisKeyType.AI_AUTO_TUNE_APPLY_LOCK.key; |
| | | String lockToken = UUID.randomUUID().toString(); |
| | | if (!redisUtil.trySetStringIfAbsent(lockKey, lockToken, APPLY_LOCK_SECONDS)) { |
| | | return rejectRollbackForUnavailableLock(reason, sourceChanges, now, lockKey); |
| | | } |
| | | |
| | | try { |
| | | try { |
| | | RollbackPersistenceResult persistenceResult = persistRollbackResultInTransaction( |
| | | rollbackJob, |
| | |
| | | } |
| | | |
| | | private AutoTuneApplyResult rejectRollbackForUnavailableLock(String reason, |
| | | List<AiAutoTuneChange> sourceChanges, |
| | | Date now, |
| | | String lockKey) { |
| | | boolean lockKeyExists = redisUtil.hasKey(lockKey); |
| | | LOGGER.warn("申请AI自动调参 rollback 锁失败,lockKey={}, lockKeyExists={}", lockKey, lockKeyExists); |
| | | AiAutoTuneJob rollbackJob = createRollbackJob(reason, now); |
| | | RollbackPersistenceResult persistenceResult = persistFailedRollbackResultInTransaction( |
| | | RollbackPersistenceResult persistenceResult = persistRollbackLockFailureInTransaction( |
| | | rollbackJob, |
| | | sourceChanges, |
| | | new IllegalStateException(APPLY_LOCK_BUSY_REASON), |
| | | now |
| | | ); |
| | | return buildResult(rollbackJob, persistenceResult.getRollbackChanges(), false); |
| | |
| | | }); |
| | | } |
| | | |
| | | private RollbackPersistenceResult persistRollbackLockFailureInTransaction(AiAutoTuneJob rollbackJob, Date now) { |
| | | TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); |
| | | return transactionTemplate.execute(status -> { |
| | | saveJob(rollbackJob); |
| | | List<AiAutoTuneChange> rollbackChanges = buildRollbackLockFailureChanges(rollbackJob.getId(), now); |
| | | saveAuditChanges(rollbackChanges); |
| | | finishRollbackJob(rollbackJob, rollbackChanges, now); |
| | | updateJob(rollbackJob); |
| | | return new RollbackPersistenceResult(rollbackChanges, false); |
| | | }); |
| | | } |
| | | |
| | | private RollbackPersistenceResult rollbackChanges(Long rollbackJobId, List<AiAutoTuneChange> sourceChanges, Date now) { |
| | | List<AiAutoTuneChange> rollbackChanges = new ArrayList<>(); |
| | | boolean refreshConfigCache = false; |
| | |
| | | return new RollbackPersistenceResult(rollbackChanges, refreshConfigCache); |
| | | } |
| | | |
| | | private List<AiAutoTuneChange> buildRollbackLockFailureChanges(Long rollbackJobId, Date now) { |
| | | AiAutoTuneChange rollbackChange = new AiAutoTuneChange(); |
| | | rollbackChange.setJobId(rollbackJobId); |
| | | rollbackChange.setTargetType(AutoTuneTriggerType.ROLLBACK.getCode()); |
| | | rollbackChange.setTargetId(""); |
| | | rollbackChange.setTargetKey("latest_successful_job"); |
| | | rollbackChange.setResultStatus(ChangeStatus.FAILED.getCode()); |
| | | rollbackChange.setRejectReason(APPLY_LOCK_BUSY_REASON); |
| | | rollbackChange.setCreateTime(now); |
| | | return List.of(rollbackChange); |
| | | } |
| | | |
| | | private void refreshRollbackConfigCacheIfNeeded(RollbackPersistenceResult persistenceResult) { |
| | | if (persistenceResult != null && persistenceResult.isRefreshConfigCache()) { |
| | | configService.refreshSystemConfigCache(); |