背景
PR #445(已合入 main @ fb6dddc)为 validateAutomationSchedule 新增 cronDateFeasible 永假组合短路并「创建即拒」,但未考虑存量数据升级路径。
问题
#408 的用户可能已有持久化的永假 cron job(旧版 validate 放行、nextRunAt 存 null)。升级后:
automation-runner-service.ts:331:scheduleJob 内 job.nextRunAt ?? getNextAutomationRunAt(...) —— 后者内部调 validate 现含 feasibility throw
scheduleJob / refreshAutomationRunnerJobs(:360-367) 均无 try/catch,且 refresh 先 clearSchedules() 再遍历
后果:一个坏 job 令整轮刷新中断——其余全部 job 定时器被清且不再补;startAutomationRunner await 失败连带 routine 条目调度失败;每次 refresh 复现。旧版同路径只慢不抛,属升级回归。
建议(任选其一或组合)
- feasibility 检查只放创建/改期入口(create/updateJob 已显式调用处);
getNextAutomationRunAt 对存量坏表达式返 null(跳过调度而非抛)
scheduleJob 逐 job 隔离异常(单 job 失败不影响其余)
- 迁移时对存量 job 跑一次 feasibility 清洗
另注意相关语义矛盾(PR#445 遗留):matchCronExpression dom/dow 同限取 AND,新增 cronDateFeasible 假设 OR——0 9 31 2 1 类表达式 feasible 判 true 但实际永假,逐分钟空转卡顿在该类上未修复,两边必须统一。
背景
PR #445(已合入 main @ fb6dddc)为
validateAutomationSchedule新增cronDateFeasible永假组合短路并「创建即拒」,但未考虑存量数据升级路径。问题
#408 的用户可能已有持久化的永假 cron job(旧版 validate 放行、
nextRunAt存 null)。升级后:automation-runner-service.ts:331:scheduleJob内job.nextRunAt ?? getNextAutomationRunAt(...)—— 后者内部调 validate 现含 feasibility throwscheduleJob/refreshAutomationRunnerJobs(:360-367) 均无 try/catch,且 refresh 先clearSchedules()再遍历后果:一个坏 job 令整轮刷新中断——其余全部 job 定时器被清且不再补;
startAutomationRunnerawait 失败连带 routine 条目调度失败;每次 refresh 复现。旧版同路径只慢不抛,属升级回归。建议(任选其一或组合)
getNextAutomationRunAt对存量坏表达式返 null(跳过调度而非抛)scheduleJob逐 job 隔离异常(单 job 失败不影响其余)另注意相关语义矛盾(PR#445 遗留):
matchCronExpressiondom/dow 同限取 AND,新增cronDateFeasible假设 OR——0 9 31 2 1类表达式 feasible 判 true 但实际永假,逐分钟空转卡顿在该类上未修复,两边必须统一。