在模块教程 KernelSU 解决方案中,我们讨论了如何处理任务调度中的错误情况,特别是当任务因为资源繁忙而无法立即执行时。以下是对您提出的问题的详细分析和建议解决方案。
问题所在
在文件 backend/src/schedules.rs 的 run 函数中,当遇到错误 Err(AppError::Busy) 时,当前的实现是将 next_run_at 设置为 now + BUSY_RETRY_MS,而没有保留原始的 due 值。这意味着后续的执行将会基于这个被修改过的值,导致每次执行都存在相同的偏差。
行为
这种行为的具体表现是:如果任务首次计划在 10:00 执行,间隔为 60 分钟,但在 10:00 时队列处于满状态,队列恢复后任务将在 10:01 执行。随后任务将在 11:01 和 12:01 执行,而不是预期的 11:00 和 12:00。
复现
- 新建一个计划任务,首次执行时间为 10:00,间隔 60 分钟。
- 在 10:00 时使队列处于满状态。
- 队列恢复后,任务计划在 10:01 执行。
- 之后任务将在 11:01 和 12:01 执行,而不是 11:00 和 12:00。
附带问题
另一个问题是 request_key 包含 due,在重试时 key 会改变,这与“重试同一个槽位”的注释相矛盾。
期望与建议
我们期望的是只延迟本次触发,而不是影响后续的执行。建议可以单独保存重试时间,或者在任务成功后按照原始的 due 值来计算下一个执行槽位。此外,建议补充 Busy 路径的测试,以确保系统的健壮性和准确性。
通过这些改进,我们可以确保任务调度系统在资源繁忙的情况下仍能正确地执行任务,同时保持任务的执行顺序和时间间隔的一致性。
评论已关闭