在模块教程 KernelSU 解决方案中,我们遇到了一个关于任务调度的问题,具体体现在 backend/src/schedules.rs 文件的 run 函数中,当遇到 Err(AppError::Busy) 错误时,代码将 next_run_at 设置为 now + BUSY_RETRY_MS,而忽略了原始的 due 值。这导致后续的 following() 函数继续使用这个被修改过的值,从而造成每次执行任务时都存在相同的偏差。
具体的行为表现如下:
- 新建一个计划任务,首次执行时间为 10:00,间隔设置为 60 分钟。
- 在 10:00 时,人为使队列处于满状态,模拟系统繁忙的情况。
- 当队列恢复后,计划任务应该在 10:01 执行,但由于
next_run_at被错误地修改,任务实际上会在 10:01 之后执行。 - 这种偏差会持续累积,导致后续的执行时间依次推迟,如 11:01、12:01 而不是预期的 11:00、12:00。
此外,还有一个附带问题,即 request_key 包含 due 信息,在任务重试时,request_key 的值会改变,这与“重试同一个槽位”的注释相矛盾。
针对上述问题,我们期望的解决方案是只将本次触发任务延后,而不是影响后续的执行计划。具体的建议包括:
- 可以单独保存重试时间,以便下次重试时使用。
- 在任务成功执行后,应按照原始的
due值来计算下一槽位的执行时间。 - 建议补充关于
Busy路径的测试,以确保系统的稳定性和准确性。
评论已关闭