FIFO 过期时会重新提交正在运行的任务,而不恢复备份行; Poll 然后会丢弃过期的 Error() 任务 (3.17.0)
3.17.0 版本中,具有持久队列(`WithTaskStore`)的 `persistentQueue.Poll` 在分配工作时会删除 `tasks` 备份行(`TaskDelete`,`server/queue/persistent.go:69`)。这是为了设计用于故障恢复(运行中的工作在服务器重启时不应重新加入队列)。`fifo.resubmitExpiredPipelines`(`constant.TaskTimeout`,硬编码的 `time.Minute` — `shared/constant/constant.go:41`)随后将同一 ID 从 `running` 移至 `pending`,但不执行 `TaskInsert`(`fifo.go:421-431` — 没有存储写入;fifo 根本不保存任何存储引用)。该 ID 的下一次 `Poll` 会触发 `TaskDelete` → `sql: 结果集中没有行` → #6765 的路径(`pull queue item: %s: not found in backup, dropping stale task`,`persistent.go:75`),然后 `Queue.Error` 该 ID(`persistent.go:76`)。仍然保留容器的代理现在已脱销:它可能会运行多分钟,然后 `queue.Done` 会记录 `queue: task not found` / `cannot ack workflow`。工作流程被存储为 `killed` / `Canceled`,且 `cancel_info` 为空。#6765 假设缺少备份行意味着工作流程已经完成或取消。如果行缺失是由于第一次 Poll 以及过期重新提交,则这是错误的。
内容来源: woodpecker-ci/woodpecker