KernelSU 解决方案:任务队列满时计划任务的处理优化
问题概述
在任务调度系统中,当任务计划在预定时间执行时,任务队列已满导致任务无法执行,系统会将任务推迟1分钟重试。然而,这种推迟操作被错误地当作新的基准时间,导致后续任务执行时间也跟着偏移,破坏了原有的执行节奏。
问题代码位置
该问题的代码位于 backend/src/schedules.rs 文件的 run 函数中,具体是在处理 AppError::Busy 错误的分支。
问题细节
- 在处理
AppError::Busy错误的分支中,系统将next_run_at设置为now + BUSY_RETRY_MS。 - 在下一次任务执行时,读取到的
due值已经是这个被推迟的时间,导致following(due, interval, now)函数根据这个推迟值计算后续的任务执行时间。 - 由于
request_key = schedule-{id}-{due}也发生了变化,这与注释中所述的“重试同一个槽位”不一致。
示例说明
假设有一个每60分钟执行一次的计划任务,首次预定在10:00执行。如果在10:00遇到队列满的情况,任务会被推迟到10:01执行。之后,任务会在11:01、12:01依次执行。如果再次遇到队列满的情况,任务会再次被推迟,导致执行时间持续偏移。
期望行为与解决方案
期望的行为是只推迟本次任务,而不改变原有的执行节奏。为此,建议修改代码逻辑,确保在任务被推迟时,后续任务的执行时间不会受到影响。同时,建议增加一个覆盖 Busy 路径的测试用例,以确保问题得到有效解决。
优化建议
- 保持
next_run_at的值不变,仅在任务实际执行时更新时间。 - 修改
request_key的生成逻辑,确保在任务被推迟时,仍然能够重试同一个槽位。 - 增加测试用例,覆盖任务队列满时的处理路径,确保系统的健壮性和稳定性。
通过这些优化措施,可以有效解决任务队列满时计划任务执行时间偏移的问题,提高系统的可靠性和用户体验。
评论已关闭