今天 seed 后容器重启,白天被当成「到期」打穿克隆壳做了全量;当晚 23:15 反而因已 completed 不再跑。根因是:该不该跑、跑到哪、何时重试 都挂在进程内存的 next_run 上,一重建就丢,只能猜。
next_run
!7 里用墙钟/force 门槛补洞会越补越绕。下面用任务状态 + 进度持久化一次收口。
force
调度器只认落盘状态,不因重启/重建提前或漏跑。
name
stat_date
status
pending
running
done
failed
deferred
due_at
progress
updated_at
失败、跳过、静默窗延后:只改 status + 写未来的 due_at,不清进度。
周期扫描状态库:
status=running
due_at > now
due_at <= now
due_at = now + 间隔
启动时不再把日更 next_run 置 0,也不根据「有 seeded」自行 force。
重启要不要跑 / 算哪天 看状态:有未完成(含中断的 running)→ 按同一 stat_date 续跑;已 done → 等下一条 pending 的 due_at;只有 seed 壳、晚上才 seal → 当晚 snapshot 的 due_at=snapshot_at,白天不会因重启提前全量。
due_at=snapshot_at
延时重试被提前 重试时间在 due_at 里;没到点调度器不跑。
全站快照已有「当日 ok=1 跳过」半套断点,显式写入 progress(或沿用行级 ok)即可续跑。其它任务按粒度各自定义,接口统一。
snapshot_at
已在 !7 分支落地 #8(未合并)。
f408da93c20237bb7bcfc36e74346452fd02ac0f
reaction_board/task_state.py
task:state:{name}
keep_scraped
test_task_state
test_{cli,scheduler,snapshot,timeutil,web_queries}
PR:#7
already_completed
实现侧:!7 按此收口(含升级回填、ensure_pending 跨日、CLI --force / keep_scraped、落盘 due_at 与内存调度同步)。
ensure_pending
--force
f6bef59
已在 !7 实现用户 2026-11-03 三条产品规则 + 评审缺口 A–D:
stat_date < today
started_at
started_at >=
另:task:last 冷启动回填、ensure_pending 跨日不粘字段、keep_scraped 区分 seal/CLI --force、Scheduler due_reader 每轮认盘。
task:last
due_reader
测过:test_{cli,scheduler,snapshot,timeutil,task_state,web_queries}。
test_{cli,scheduler,snapshot,timeutil,task_state,web_queries}
No dependencies set.
The note is not visible to the blocked user.
背景
今天 seed 后容器重启,白天被当成「到期」打穿克隆壳做了全量;当晚 23:15 反而因已 completed 不再跑。根因是:该不该跑、跑到哪、何时重试 都挂在进程内存的
next_run上,一重建就丢,只能猜。!7 里用墙钟/
force门槛补洞会越补越绕。下面用任务状态 + 进度持久化一次收口。目标
调度器只认落盘状态,不因重启/重建提前或漏跑。
模型(每条任务一条记录)
namestat_datestatuspending/running/done/failed/deferreddue_atprogressupdated_at失败、跳过、静默窗延后:只改
status+ 写未来的due_at,不清进度。调度器
周期扫描状态库:
status=running且进程已死 → 视为中断,改为可续跑(pending/failed),保留 progress 与 stat_datedue_at > now→ 不触发due_at <= now且未done→ 拉起;有 progress 则续跑,无则从头done,清 running;按规则写入下一次pending+ 新due_at(如次日 seed_at / snapshot_at)failed/deferred+due_at = now + 间隔启动时不再把日更
next_run置 0,也不根据「有 seeded」自行 force。和今天两个问题的对应
重启要不要跑 / 算哪天
看状态:有未完成(含中断的 running)→ 按同一
stat_date续跑;已done→ 等下一条 pending 的due_at;只有 seed 壳、晚上才 seal → 当晚 snapshot 的due_at=snapshot_at,白天不会因重启提前全量。延时重试被提前
重试时间在
due_at里;没到点调度器不跑。进度
全站快照已有「当日 ok=1 跳过」半套断点,显式写入
progress(或沿用行级 ok)即可续跑。其它任务按粒度各自定义,接口统一。非目标(本方案不做)
验收(原则)
stat_date续跑,不重开错误的一天snapshot_at:重启不会 force 全量due_at后重启:到期前不跑,到期后才跑已在 !7 分支落地 #8(未合并)。
f408da93c20237bb7bcfc36e74346452fd02ac0freaction_board/task_state.py(task:state:{name}:status / due_at / stat_date / progress)due_at;恢复残留running同stat_date续跑;due_at > now不提前keep_scraped打穿 seed、保留已 view 进度test_task_state+test_{cli,scheduler,snapshot,timeutil,web_queries}通过PR:#7
产品规则(2026-11-03 用户定)
stat_date做完(避免昨天没有快照基点)。already_completed,但该次完成的开始时间早于当日计划点(如snapshot_at23:15),视为非计划内任务,仍按计划再跑;若开始时间等于或晚于计划点,才可跳过。实现侧:!7 按此收口(含升级回填、
ensure_pending跨日、CLI--force/keep_scraped、落盘due_at与内存调度同步)。产品规则落地(tip
f6bef59)已在 !7 实现用户 2026-11-03 三条产品规则 + 评审缺口 A–D:
stat_date续跑;stat_date < today时 force seal,不受「今日未到 snapshot_at」挡住。already_completed但完成记录的started_at(禁止 finished_at) 早于当日计划点 → 到点仍跑;started_at >=计划点才跳过。另:
task:last冷启动回填、ensure_pending跨日不粘字段、keep_scraped区分 seal/CLI--force、Schedulerdue_reader每轮认盘。测过:
test_{cli,scheduler,snapshot,timeutil,task_state,web_queries}。