在模块教程 KernelSU 解决方案中,我们讨论了位置在 backend/src/schedules.rs 中的 ScheduleService::run 函数。该函数的注释说明当队列满时,会“重试同一个槽位”,但实际实现是直接修改 next_run_at。这种实现方式导致了以下问题:

  1. 槽位时间 due 被替换为 now + BUSY_RETRY_MS;
  2. following() 函数之后以新值为起点,原网格被平移;
  3. request_key(包含 due)随之变化,不再是同一个槽位。

这种行为的复现情况是:首次在 10:00,每 60 分钟执行一次。当 10:00 遇到队列满时,实际会在 10:01 才执行,导致后续的执行时间变为 11:01、12:01 等。

对于期望的行为,我们希望网格能够保持 10:00、11:00、12:00 的执行时间,仅当次任务延后。此外,在修复这个问题时,建议补上对 Busy 分支的测试覆盖,以确保代码的健壮性。