在模块教程 KernelSU 解决方案中,我们关注到了一个代码问题,它影响了 backend/src/schedules.rs 文件中的 run() 函数,特别是在处理 Busy 状态时。问题描述为:当队列繁忙时,重试逻辑将计划的 next_run_at 直接设置为“现在 + 1 分钟”。这个新时间在下次运行时成为 due,而 following() 函数是基于 due 构建网格的,因此网格被带偏,且不会自行恢复。重现场景描述了每 60 分钟执行一次的计划任务,首次执行时间为 10:00,但由于队列满,计划被改到 10:01,实际执行时间依次为 10:01、11:01、12:01,再次遇到队列满会进一步偏移。此外,request_key 使用 due 拼接,在重试时 key 变化,与代码注释中“同一个槽位”的说法不符。期望是重试不应改变网格,仅推迟本次执行。目前,针对这一路径没有测试。针对这一问题,我们需要设计一种解决方案,确保重试逻辑不会导致网格的偏移,并且能够保持 request_key 的稳定性,以符合代码注释中的描述。我们可以考虑引入一个缓冲机制,在队列繁忙时,将任务暂时存储在一个缓冲区中,而不是直接修改 next_run_at。这样,即使队列繁忙,也不会影响网格的整体结构,同时可以保证 request_key 在重试时保持不变。此外,我们还需要编写测试用例,确保这一解决方案能够有效地解决当前的问题。